首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入探索SQL优化:利用慢查询日志和explain提升数据库效率

rowsEstimate of rows to be examined (预估扫描行数)filteredPercentage of rows filtered by tablecondition (按表条件过滤的行百分比...UNIONunion或union all联合而成的结果会受外部表影响UNION RESULT从union表获取结果的selectSUBQUERYselect或者where列表中包含子查询DEPENDENT...SUBQUERYsubquery的子查询要受到外部表查询的影响DERIVEDfrom子句中出现的子查询,也叫做派生表UNCACHEABLE SUBQUERY一个子查询,其结果不能被缓存,必须为外部查询的每一行重新求值...UNCACHEABLE UNION表示union的查询结果不能被缓存:sql语句未验证3.4、table对应行正在访问哪一个表,表名或者别名,可能是临时表或者union 合并结果集。...慢查询日志可用于查找需要很长时间才能执行的查询,因此是优化的候选项。但是,检查较长的慢查询日志可能是一项耗时的任务。

20310

left join使用不当性能居然相差58倍

【50ms】,union all结果集之后【8s】,sql执行时间相差160倍!...上述的sql执行结果有三个子查询组成,结果使用union all进行关联 1.union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序; 2.union All:对两个结果集进行并集操作...,包括重复行,不进行排序; 3.union 和 union all都可以将多个结果集合并,而不仅仅是两个,你可以将多个结果集串起来。...,union all就是将子查询结果集直接进行了拼接。...过了大约半个小时候,同事突然让我再试试sql,瞬间执行时间只需要137ms了【优化后的速度比优化前快了58倍】。差不多是三个子查询时间的总和,符合结果集拼接预期时间。

2.9K21
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    浅谈数据库优化

    这里主要有以下5点原因:1、hash函数计算后的结果,是随机的,如果是在磁盘上放置数据。比主键为id为例, 那么随着id的增长, id对应的行,在磁盘上随机放置. 2、不法对范围查询进行优化。...优化 建议使用union all 而不是union。...union all 不过滤 效率提高,如非必须,请用union all。因为 union去重的代价非常高, Mysql会把各个查询结果插入到临时表中,然后做唯一性检查。所以请放在程序里去重。...性能分析工具 开启慢查询日志 MySQL 慢查询的相关参数解释: slow_query_log :是否开启慢查询日志,1表示开启,0表示关闭。...* from test.tabname where id in(1,3,5,7,9,11,13,15,17,19); 通过explain发现其实他是先根据关联外部tabname, 而不是先去执行这个子查询

    14410

    MySQL EXPLAIN详解

    在查询中创建了一个临时表,通常发生在包含GROUP BY或DISTINCT的查询中。 UNION:UNION操作 表示在查询中使用了UNION或UNION ALL操作。 多个查询结果集合并的情况。...UNION RESULT:UNION结果 表示合并了多个查询结果的最终结果。 在包含UNION的查询中,表示最终的合并步骤。...SUBQUERY N:带编号的子查询 表示查询中的第N个子查询,N为正整数。 在包含多个子查询的查询中,通过编号区分不同的子查询。...filtered 在查询过程中过滤的行的百分比 filtered的取值范围 filtered的值是一个百分比,范围从0到100。0表示没有任何过滤,100表示所有的行都被过滤。...单表查询 在单表查询中,filtered表示使用索引和条件过滤掉的行的百分比。 多表查询 在多表连接查询中,filtered表示在连接操作后使用索引和条件过滤掉的行的百分比。

    43210

    「mysql优化专题」你们要的多表查询优化来啦!请查收(4)

    顾名思义,Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。...2)然而在一些特定的场景,可以直接从数据库读取就可以的,比如一个表(A表 a,b,c字段,需要内部数据交集)join自己的效率必然比放一个子查在where中快得多。...如果不想去掉重复的行,可以使用union all。 如果子句中有order by,limit,需用括号()包起来。推荐放到所有子句之后,即对最终合并的结果来排序或筛选。 ?...同时,每条 SELECT 语句中的列的顺序必须相同 UNION ALL的作用和语法: 默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。...当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。 ?

    2K20

    优化查询性能:UNION与UNION ALL的区别

    作用 在SQL查询中,当我们需要合并多个查询结果集时,我们通常会使用UNION和UNION ALL操作符,同时,如果你写的or语句不走索引,可以考虑使用UNION、UNION ALL优化。...去重操作需要比较和过滤结果集中的每一行,这可能会导致较大的性能消耗。因此,在使用UNION操作符时,需要权衡结果集的唯一性和性能开销之间的折衷。...UNION ALL 与之相对的是UNION ALL操作符。UNION ALL也用于合并多个查询结果,但与UNION不同的是,它不进行去重操作。这意味着UNION ALL返回的结果集可能包含重复的行。...然而,由于没有去重的开销,UNION ALL的性能通常比UNION更好。如果我们已经确保结果集中没有重复行,或者我们不关心结果集中的重复行,那么使用UNION ALL可以获得更好的查询性能。...两者区别 结果集:UNION会在结果集中去重 结果集顺序:UNION会在最终结果集进行排序,UNION ALL不会进行排序,结果集顺序由各个子查询顺序决定 性能:由于UNION会去重和排序,因此UNION

    1.6K20

    一条慢sql引发的思考

    减少数据集大小:单表查询通常会减少结果集的大小,因为它们不会产生笛卡尔积,避免了不必要的数据组合。 提高查询性能:单表查询往往比联表查询更快速,特别是当联表查询涉及大量数据时,单表查询更有效率。...Extra 附加信息 id:这是查询的序号,显示查询中每个子查询的唯一标识符。...DERIVED:派生表,使用了子查询的结果。 UNION:UNION 中第二个 SELECT 开始的查询。 UNION RESULT:UNION 的结果。 table:显示与查询相关的表名。...index:全索引扫描,比较慢,但比全表扫描快。 all:全表扫描,性能最差。 possible_keys:显示可能用于此查询的索引,但不一定实际使用。 key:实际用于查询的索引。...rows:估计查询将扫描的行数。 filtered:表示优化器过滤结果集的百分比。 Extra:提供有关查询的额外信息,例如是否使用了临时表、使用了索引提示、使用了文件排序等。

    35310

    MySQL EXPLAIN,数据库调优的秘密通道

    如果查询包含多个子查询或联合查询,MySQL 会为每个子查询分配一个唯一的 id。 如果 id 相同,表示这些查询是并行执行的。...UNION: UNION 中的第二个或后续的 SELECT 语句。 DEPENDENT UNION: UNION 中的第二个或后续的 SELECT 语句,依赖于外部查询。...常见类型有: ALL: 全表扫描,性能最差。 index: 全索引扫描(索引的每一行都会被扫描)。 range: 使用索引选择给定范围的行。...filtered: 表示返回结果的行占开始查找行的百分比。 Extra: 包含不适合在其他列中显示但对执行计划非常重要的额外信息。常见值有: Using where: 使用 WHERE 过滤。...Extra: 额外的信息,这里是 Using where 表示使用了 WHERE 子句进行过滤。 全表扫描 现在我们想要查询所有员工的姓名,并且我们没有在 name 列上创建索引。

    4910

    explain | 索引优化的这把绝世好剑,你真的会用吗?

    前言 对于互联网公司来说,随着用户量和数据量的不断增加,慢查询是无法避免的问题。一般情况下如果出现慢查询,意味着接口响应慢、接口超时等问题。...慢查询的确会导致很多问题,我们要如何优化慢查询呢?...从上图中看到执行结果中会显示12列信息,每列具体信息如下: ? 说白了,我们要搞懂这些列的具体含义才能正常判断索引的使用情况。 话不多说,直接开始介绍吧。...列表中包含了子查询 DERIVED FROM列表中包含的子查询,即衍生 UNION UNION关键字之后的查询 UNION RESULT 从UNION后的表获取结果集 下面看看这些SELECT类型具体是怎么出现的...rows列 该列表示MySQL认为执行查询必须检查的行数。 ? 对于InnoDB表,此数字是估计值,可能并不总是准确的。 filtered列 该列表示按表条件过滤的表行的估计百分比。

    1.8K31

    SQL优化法则小记

    在这单表查询统计的情 况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是 where 可以使用 rushmore 技术,而 having 就不能,在速度上后者要慢如果要涉及到 计算的字段...在多表联接查询时,on 比 where 更早 起作用。系统首先根据各个表之间的联接条件,把多个表合成一个临时表后,再由 where 进行过滤,然后再计算,计算完后再由 having 进行过滤。...这也是一条简单而重要的规则,当仅引用索引的 第二个列时,优化器使用了全表扫描而忽略了索引. 28.用 union-all替换 union( 如果有可能的话): 当 SQL 语句需要 union 两个查询结果集合时...,这两个结果集合会以 union-all的方 式被合并, 然后在输出最终结果前进行排序....如果用 union-all替代union, 这样排 序就不是必要了. 效率就会因此得到提高. 需要注意的是, union-all 将重复输出两 个结果集合中相同记录.

    2.1K90

    MySQL-如何定位慢查询SQL以及优化

    慢查询日志记录慢SQL 定位慢SQL可以通过慢查询日志来查看慢SQL,默认的情况下,MySQL数据库不开启慢查询日志(slow query log),需要手动把它打开 SET GLOBAL slow_query_log...如果是子查询,id 值会递增,id 值越高,优先级越高 3. id为NULL最后执行 select_type 1. simple: 简单的select, 查询中不包含子查询或者 union。...例如: EXPLAIN select id from student where idUNION all select id from student where id<12691060...估算找到我们所需的记录,需要读取的行数 filtered 该列是一个百分比,是满足条件的记录数量与我们查询了多少记录数量的比值 extra 该字段包含有关MySQL如何解析查询的其他信息,它一般会出现这几个值...语句 ● Using where : 表示使用了where条件过滤 ● Using index condition:MySQL5.6之后新增的索引下推,在存储引擎层进行数据过滤,而不是在服务层过滤,

    69451

    explain | 索引优化的这把绝世好剑,你真的会用吗?

    前言 对于互联网公司来说,随着用户量和数据量的不断增加,慢查询是无法避免的问题。一般情况下如果出现慢查询,意味着接口响应慢、接口超时等问题。...慢查询的确会导致很多问题,我们要如何优化慢查询呢?...: 从上图中看到执行结果中会显示12列信息,每列具体信息如下: 说白了,我们要搞懂这些列的具体含义才能正常判断索引的使用情况。...SELECT或WHERE列表中包含了子查询 DERIVED FROM列表中包含的子查询,即衍生 UNION UNION关键字之后的查询 UNION RESULT 从UNION后的表获取结果集 下面看看这些...rows列 该列表示MySQL认为执行查询必须检查的行数。 对于InnoDB表,此数字是估计值,可能并不总是准确的。 filtered列 该列表示按表条件过滤的表行的估计百分比。

    1K20

    explain 分析sql语句字段的解释

    union:若第二个select出现在union之后,则被标记为union,若union包含在from子句的子查询中,外层select将被标记为:derived union result:从union...表获取结果的select partitions 表所使用的分区,如果要统计十年公司订单的金额,可以把数据分为十个区,每一年代表一个区。...all:(full table scan)全表扫描无疑是最差,若是百万千万级数据量,全表扫描会非常慢。...index:(full index scan)全索引文件扫描比all好很多,毕竟从索引树中找数据,比从全表中找数据要快。 range:只检索给定范围的行,使用索引来匹配行。...filtered 一个百分比的值,和rows 列的值一起使用,可以估计出查询执行计划(QEP)中的前一个表的结果集,从而确定join操作的循环次数。小表驱动大表,减轻连接的次数。

    3.2K51

    oracle数据库sql语句优化(循环语句有几种语句)

    12、优化GROUP BY: 提高GROUP BY 语句的效率,可以通过将不需要的记录在GROUP BY之前过滤掉。 下面两个查询返回相同结果但明显第二个效率更高。...ALL替换UNION: 当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序。...如果用UNION ALL替代UNION, 这样排序就不是必要了。 效率就会因此得到提高。需要注意UNION ALL将重复输出两个结果集合中相同记录。因此要 从业务需求使用UNION ALL的可行性。...在单表查询统计的情况下,如果要过滤的条件没 有涉及到要计算字段,那它们的结果是一样的,只是where可以使用rushmore技术,而having 就不能,在速度上后者要慢。...在多表联接查询时,on比where更早起作用。系统首先根据各个表之间的关联 条件,把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完后再由having 进行过滤。

    2.9K10

    启用MySQL查询缓存

    UNION(UNION中的第二个或后面的SELECT语句) (4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询) (5) UNION RESULT(UNION..., FROM子句的子查询) (9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行) table 显示这一行的数据是关于哪张表的,有时不是真实的表名字...通过这些可以看到正在执行的慢查询. 然后再用profile进行分析, 看看到底慢在哪里了 5....有几种原因 字段的长度过大, 可以通过show table status来查看表的状态     红色圈出的部分就是我们查询的相关表的信息. Avg_row_length: 表示平均每一行的长度....使用的是单表查询, 单表查询比连表要快很多, 查询出来以后, 将业务逻辑在代码里拼接, io消耗比与数据库交互少很多. JPA使用注意事项: 1.

    2.1K30

    SQL 性能优化 总结

    在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where可以使用rushmore 技术,而having 就不能,在速 度上后者要慢如果要涉及到计算的字段...在多表联接查询时,on比 where 更早起作用。...(28) 用UNION-ALL替换UNION ( 如果有可能的话): 当SQL 语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL 的方式被 合并, 然后在输出最终结果前进行排序....如果用UNION ALL替代UNION, 这样排序就不是必要了....效率就会因此得到提高.需要注意的是,UNION ALL 将重复输出两个结果集合中相同记录.因此各位还是要从业务需求分析使用 UNION ALL的可行性.

    1.9K20

    SQL学习之组合查询(UNION)

    ok,完成需求,通过和上面没有使用UNION关键的分开查询相比,我们发现UNION(组合查询)从结果集中去除了重复的行。 这里我们可以使用UNION ALL,告诉DBMS不取消重复的行。...那么效果就和上面没加UNION的一样 3、总结 分析上面完成需求的连个例子,我们发现对于上面的简单的例子使用UNION似乎比WHERE子句更加的复杂。...但是这里你需要知道,如果对于较复杂的过滤条件,或者从多个表(而不是一个表)中检索数据的情形,使用UNION可能会使处理更加的简单。...4、使用UNION必须知道的规则(使用注意事项) (1)使用UNION必须有两条或者两条以上的SELECT语句组成,语句之间用UNION关键字分割 (2)使用UNION关联的每个子查询必须包含相同的检索列...,UNION ALL是UNION的一种形式,它完成WHERE子句完成不了的工作,因为他将返回每个条件的匹配行(包括重复行) (5)使用组合查询,当需要对结果进行排序是,只能指定一条Order By语句,

    1.3K100
    领券