MySQL Explain详解

MySQL Explain

字段名

描述

id

执行编号,标识select所属的行。如果在语句中没子查询或关联查询,只有唯一的select,每行都将显示1。

否则,内层的select语句一般会顺序编号,对应于其在原始语句中的位置。

select_type

Select的类型。 复杂的查询情况下,这个字段的值有:SUBQUERY(表示子查询)、UNION(第二个或后面的UNION语句)、DERIVED和其它一些值。

table

当前行对应的表名或别名。

type

表明对应表的访问(或联接)方式。最常见的Type值有, All,index, range, ref, eq_ref, const, system, 这里的顺序是从最坏到最好。

possible_keys

这个字段指明了MySQL在查找表中数据行时可能会使用到的Key。由于MySQL选用执行方式的不同,这里列的索引可能跟实际不相关。

一般来说,MySQL会使用索引来关联表。当然这么说,也不意味着会使用第一个表的联接列(use an index on the first table's join column),这里MySQL会遍历所有行(除通过Where部分过滤掉的行之外)。

key

这一字段表明MySQL最终决定使用的索引。这里注意下,并不意味着会使用到整个索引,也有可能使用部分内容,即通过最左优先的方式。

key_len

这一列是Explain结果中最重要的一个。它表明MySQL使用Key的长度,单位是Bytes。

rows

表示MySQL判断后决定执行SQL中必须要遍历的行数。这只是一个估算值。通常情况下,这个值越高, 也就意味着查询语句还有很大的优化空间。

filtered

表示Where条件中未过滤掉的行数。这些行将会跟Explain中下一行的表关联。和前面提到的一样,这也是一个估算值,MySQL在这个值上可能会出错。

extra

包含了SQL执行中的另外一些信息,下面列举下,我们查询中,这一部分的内容:

  • using where - 表示使用Where条件来过滤。

  • using temporary - MySQL执行过程中, 可能会创建临时表。在大多数情况下,使用临时表会影响SQL执行效率。临时表也表示, 没有使用索引情况下,有ORDER BY或GROUP BY执行了。如果ORDER BY和GROUP BY使用了不一样的列(或不同的顺序)时,也会使用到临时表。

  • using filesort - 表明MySQL进行了另一个阶段,对查询结果排序。很多情况下,这也会带来性能上的损耗。 


MySQL Explain详解
https://shikai.info/archives/mysql-explain
作者
石 凯
发布于
2023年08月16日
许可协议