mysql explain 12列信息解释
mysql explain
explain能解释mysql如何处理查询sql,表加载顺序、表如何连接、索引的使用情况等。
展示的信息一共有12列,
分别是id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra。
如:
id
select查询序列号
id如果相同,可认为是同一组,同组的从上往下执行,
id值越大,越先被执行。
select_type
当前查询的类型
select_type | 含义 |
---|---|
SIMPLE | 简单查询,不使用子查询或union。 |
PRIMARY | 查询中若包含任何复杂的子部分,最外层的select会被标记为primary。 |
UNION | union中第二个或之后的select。 |
DEPENDENT UNION | union中第二个或之后的select,取决于外面的查询。 |
UNION RESULT | union的结果。 |
SUBQUERY | 子查询中的第一个select。 |
DEPENDENT SUBQUERY | 子查询中的第一个select,取决于外面的查询。 |
DERIVED | 衍生表(from子句中的查询)。 |
MATERIALIZED | 物化子查询。 |
UNCACHEABLE SUBQUERY | 结果集无法缓存的子查询,必须重新评估外部查询的每一行。 |
UNCACHEABLE UNION | union中第二个或之后的select,无法缓存的查询。 |
table
表名
显示这一步所访问的表的名称。
type
对表的访问方式
常见的类型有system、const、eq_ref、ref、range、index、all等,
除了all之外、其它的type都可以用到索引,
除了index_merge之外,其它的type都最多可以使用一个索引。
index_merge是索引合并,在mysql多列索引(组合索引)特点和使用场景中讲过。
type | 含义 |
---|---|
system | 是const的特例,在表中只有一行记录时。 |
const | 最多只有一行记录匹配,比如primary key或unique索引。 |
eq_ref | join时,对于驱动表的每一行,在被驱动表中最多只有一行记录匹配,一般是关联的字段在被驱动表是primary key或unique索引。 |
ref | join时,对于驱动表的每一行,在被驱动表中可能会有多行记录匹配,一般是关联的字段用到了被驱动表多列索引的最左前缀或非唯一索引。 |
range | 在一定范围内遍历索引。 |
index | 遍历整个索引。 |
all | 遍历整张表,性能最差。 |
驱动表和被驱动表在MySQL join查询的原理中讲过。
性能:system > const > eq_ref > ref > range > index > all。
partitions
匹配的分区
possible_keys
查询中可能用到的索引
key
查询中用到的索引
key_len
查询中用到的索引的长度,
如果是单列索引,就是索引列的长度,
如果是多列索引,可能用到的只是一部分,留意这个key_len可以知道用到了多少列。
ref
如果条件是常数值,这里会显示const,
如果是join查询,这里会显示驱动表的关联字段,
如果条件是表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func。
rows
这是mysql估算要扫描的行数,不是精确值,
这个值非常直观地显示了sql的效率,理论上这个数越小越好。
filtered
表示选取行占读取行的百分比
Extra
一些额外的重要信息
Using temporary:意味着mysql对查询结果进行分组或排序的时候使用了一张临时表;
Using filesort:无法利用索引完成的排序称作文件排序。
这两种一般都需要优化。