Mysql系列(九)—— 性能分析explain执行计划 (2)

ref:显示哪些列或常量与键列中指定的索引进行比较,以从表中选择行。如果值是func,则表示使用函数。如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func。

比如在使用索引的等值查询中,该列会使const,如果在表连接的查询中,连接字段建立了索引,该ref值可能是连接的上一个表的连接列。

rows:执行查询时,估算出可能被查询出的行数,非实际值

filtered:表示被表条件过滤的行的百分比,也非实际值。最大值是100,表示没有任何行被过滤

extra:表示mysql怎样解析查询时的一些额外信息。这个列可以显示的信息非常多,有几十种,常用的有:

distinct:在select部分使用了distinc关键字

no tables used:不带from字句的查询或者From dual查询

使用not in()形式子查询或not exists运算符的连接查询,这种叫做反连接。即,一般连接查询是先查询内表,再查询外表,反连接就是先查询外表,再查询内表。

using filesort:排序时无法使用到索引时,就会出现这个。常见于order by和group by语句中

using index:查询时不需要回表查询,直接通过索引就可以获取查询的数据。

Using index condition:mysql引入了ICP(Index Condition Pushdown)机制。mysql server分为sever和storage engine两个组件, server 负责 sql的parse, 执行; storage engine 去真正的 做 数据/index的 读取/写入。没有ICP机制时,存储引擎根据索引查找表中的行(这里发生io,将表中的完整的行读取出来),然后将结果交给server,server再根据where中其他条件进行过滤。 如果开始ICP,server会将where中其他的条件下推至storage engine,storage engine在扫描索引的时候,根据索引项的数据于其他的条件过滤(这里从而达到二次过滤,更加精确的匹配行),找到满足的行。通常用于二级索引,且type是rang/ref/eq_ref。

using temporary:表示使用了临时表存储中间结果。临时表可以是内存临时表和磁盘临时表,执行计划中看不出来,需要查看status变量,used_tmp_table,used_tmp_disk_table才能看出来。这个常发生在使用了group by和order by的列不一样、子查询、联结表的情况下。

using where:表示存储引擎返回的记录并不是所有的都满足查询条件,需要在server层进行过滤。查询条件中分为限制条件和检查条件,5.6之前,存储引擎只能根据限制条件扫描数据并返回,然后server层根据检查条件进行过滤再返回真正符合查询的数据。5.6.x之后支持ICP特性,可以把检查条件也下推到存储引擎层,不符合检查条件和限制条件的数据,直接不读取,这样就大大减少了存储引擎扫描的记录数量。extra列显示using index condition

参考

https://dev.mysql.com/doc/refman/5.7/en/explain-output.html

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzsggj.html