select 、update、insert into、 delete等语句均被支持
id 列代表执行语句的序列,通常有几个操作关键词(select 、update、insert into、 delete)就会有几个序列.
id列值越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行
* 关联查询时,记录数取决于关联的表数,但id值相同
select_type 列这个就比较多了,贴一张官方文档中的图
(官方文档:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#explain_select_type)
个人感觉大致知道什么意思就可以了?
table 列毋庸置疑,这个就是我们正在访问的表的意思了
* 当包含子查询和union时,会略有不同
如 ,表示当前查询依赖 id=N 的查询;
,1和2表示参与 union 的 select 行id
...
possible_keys 和 key 列possible_keys列显示查询可能使用哪些索引来查找
key列显示mysql实际采用哪个索引来优化对该表的访问
key_len 列显示了mysql在索引里使用的字节数
ref 列这一列显示了在key列记录的索引中,表查找值所用到的列或常量。常见的有:const(常量),字段名...
rows 列这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数
如果查询优化器决定使用全表扫描的方式对某个表执行查询时,执行计划的rows列就代表预计需要扫描的行数
如果使用索引来执行查询时,执行计划的rows列就代表预计扫描的索引记录行数
按表条件过滤的行百分比
type 列表示关联类型或访问类型
从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL
一般来说,得保证查询达到range级别,最好达到ref
NULL
mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引
const
表中最多有一个匹配行,如where条件为表id时
eq_ref
表关联查询且用到索引时会出现
ref
假如对a表中的key1字段建立普通索引,当通过key1='a'的where条件查询时,可能会出现ref
range
通常出现在 in(), between ,> ,= 等操作中
index
虽然走了索引,但是几乎走了全部索引时出现该值,换言之,我们的索引建立的没有太大意义,区分度不是很好
ALL
全表扫描
extra 列用来说明一些额外信息
Using index
查询的列被索引覆盖,是性能高的表现
Using where
全表扫描,where条件中没有索引,需要我们建立索引
NULL
查询的列未被索引覆盖
Using index condition
与Using where类似,查询的列不完全被索引覆盖
Using join buffer (Block Nested Loop) 在连接查询执行过程中,MySQL分配一块名叫join buffer的内存块来加快查询速度
官方文档:https://dev.mysql.com/doc/refman/5.7/en/using-explain.html
封面图片来源:https://www.pexels.com/ 作者:Karolina
(此图修改自网络)