explain展示
id:
select识别符,可理解为执行顺序
相同时顺序从上到下
子查询中,id越大越优先执行
例如出现子查询:
explain
select *
from world.country c
join world.city c3 on c3.CountryCode = c.Code
where c.Code in (select c2.CountryCode from world.countrylanguage c2 where c2.IsOfficial = 1)
select_type:
select子句类型,包括
(1) SIMPLE(简单SELECT,不使用UNION或子查询等)
(2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
(3) UNION(UNION中的第二个或后面的SELECT语句)
(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)
(5) UNION RESULT(UNION的结果,union语句中第二个select开始后面所有select)
(6) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)
(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)
(8) DERIVED(派生表的SELECT, FROM子句的子查询)
(9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)
(10)MATERIALIZED(物化:用于子查询(比如在IN/NOT IN子查询以及 FROM 子查询)优化,即条件下推到物化表:第一次子查询保存为临时表,后续直接访问临时表)
table:
表名,可能是简称
type:
访问方式,性能由差到好:ALL、index、range、 ref、eq_ref、const、system、NULL
阿里规范要求:至少range,要求reg,最好const
all:full table scan,全表遍历
例如:select * from world.country c
index:full index scan,全表遍历,但仅遍历索引树
例如:select Name from world.country c
range:只检索给定范围的行,使用一个索引来选择行
例如:select * from world.country c where Name like "China%"
select * from world.country c where Name in ("China","America")
ref:索引要跟某个参考值相比较,该参考值可能为一个常数或者其他查询的结果值
例如:select * from world.country c where Name = "China"
eq_ref:类似ref,但使用的索引是唯一索引,且是联合查询
如设置id_card为唯一索引:
select * from test.`user` u, test.test t where t.id_card = u.phone
const、system:mysql将查询优化为一个常量时,出现const,如where通过主键、唯一索引查找,system是const的特例
null:mysql优化过程中分解语句,甚至不需要访问表或索引
possible_keys:
可能使用的索引,不一定使用到
key:
实际使用到的索引
key_len:
索引中使用的字节数:不损失精度情况下,越短越好
ref:
列与索引的比较:那些列或常数被用于查找索引列上的值
rows:
结果集行数
extra:
Using where:
列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询
Using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”
Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
Impossible where:这个值强调了where语句会导致没有符合条件的行。
Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行
Using index:该值表示相应的select操作中使用了覆盖索引(Covering Index)
Index merges:当MySQL 决定要在一个给定的表上使用超过一个索引的时候,就会出现以下格式中的一个,详细说明使用的索引以及合并的类型
Using sort_union(...)、Using union(...)、Using intersect(...)
Using index condition:由engine来进行where条件的筛选