MySQL EXPLAIN命令是查询性能优化不可缺少的一部分,该文主要讲解explain命令的使用及相关参数说明。
id
执行编号,标识select所属的行。如果在语句中没子查询或关联查询,只有唯一的select,每行都将显示1。否则,内层的select语句一般会顺序编号,对应于其在原始语句中的位置。
在嵌套查询中id越大的语句越先执行。
select_type
查询类型 单表查询、关联查询、子查询
类型 | 说明 |
---|---|
simple | 简单查询,不包含子查询和union |
primary | 包含union或者子查询,最外层的部分标记为primary |
subquery | 一般子查询中的子查询被标记为subquery,也就是位于select列表中的查询 |
derived | 派生表——该临时表是从子查询派生出来的,位于form中的子查询 |
union | 位于union中第二个及其以后的子查询被标记为union,第一个就被标记为primary如果是union位于from中则标记为derived |
union result | 用来从匿名临时表里检索结果的select被标记为union result |
dependent union | 顾名思义,首先需要满足UNION的条件,及UNION中第二个以及后面的SELECT语句,同时该语句依赖外部的查询 |
subquery | 子查询中第一个SELECT语句 |
dependent subquery | 和DEPENDENT UNION相对UNION一样 |
table
对应行正在访问哪一个表,表名或者别名
- 关联优化器会为查询选择关联顺序,左侧深度优先
-
- 当from中有子查询的时候,表名是derivedN的形式,N指向子查询,也就是explain结果中的下一列
-
- 当有union result的时候,表名是union 1,2等的形式,1,2表示参与union的query id
type
数据访问/读取操作类型
类型 | 说明 |
---|---|
system | const连接类型的一种特例,表仅有一行满足条件。 |
const | 对主键或UNIQUE唯一索引的等值查询,最多只会返回一行数据 |
eq_ref | 常发生在连表查询,关联的条件是某一张表的主键或UNIQUE唯一非空索引,最多只会返回一行数据 |
ref | 当满足索引的最左原则,同时并不走主键或UNIQUE唯一非空索引 |
range | 范围扫描。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可以使用 range |
index |
和全表扫描一样。只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。如在Extra列看到Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要小很多
|
ALL |
最坏的情况,全表扫描
|
一般来说,得保证查询至少达到range级别,最好能达到ref。
possible_keys
揭示哪一些索引可能有利于高效的查找
key
采用哪个索引来优化查询
key_len
索引里使用的字节数
ref
在key列记录的索引中查找值所用的列或常量
const,表示通过常量值匹配。
rows
optimizer_trace来查看执行计划优化详情