一、官方:https://dev.mysql.com/doc/refman/8.0/en/explain-output.html
二、语句:
explain select * from tableName;
- id:执行的顺序,数值大的优先执行
- select_type:查询类型,方式
select_type
值JSON名称 含义 SIMPLE
没有 简单 SELECT
(不使用UNION
或子查询)PRIMARY
没有 最外层 SELECT
UNION
没有 第二个或之后的 SELECT
陈述UNION
DEPENDENT UNION
dependent
(true
)中的第二个或更高版本的 SELECT
语句UNION
,取决于外部查询UNION RESULT
union_result
的结果 UNION
。SUBQUERY
没有 首先 SELECT
在子查询DEPENDENT SUBQUERY
dependent
(true
)首先 SELECT
在子查询中,取决于外部查询DERIVED
没有 派生表 DEPENDENT DERIVED
dependent
(true
)派生表依赖于另一个表 MATERIALIZED
materialized_from_subquery
物化子查询 UNCACHEABLE SUBQUERY
cacheable
(false
)子查询,其结果无法缓存,必须针对外部查询的每一行重新进行评估 UNCACHEABLE UNION
cacheable
(false
)UNION
属于不可缓存子查询的中的第二个或更高版本的选择(请参阅参考资料UNCACHEABLE SUBQUERY
) - table:表名
- partitions:查询将从中匹配记录的分区。该值适用
NULL
于未分区的表 - type(注意我下面写的描述是根据我实际测试的结果写的,不是完全参照官网):参考https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain-join-types
- system:该表只有一行(=系统表),const的一个特例,
- const:唯一键的=条件基本上都是这个
- eq_ref:关联子查询中有一个执行计划命中eq_ref
- ref:命中的是一个普通索引(非唯一键)
- fulltext:参考https://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html,先建立一个全文索引,再利用相应的函数进行查询
- ref_or_null:与ref不同的是增加一个or条件is null
- index_merge:这个比较容易,就是一个where or的条件语句,前后都是命中索引的
- unique_subquery:搞了半天也是没搞出来,官方语句:value IN (SELECT primary_key FROM single_table WHERE some_expr)
- index_subquery:类似于unique_subquery,适用于子查询中的非唯一键插叙,弄了好几种尝试,愣是没搞出来,先贴个官方的:value IN (SELECT key_column FROM single_table WHERE some_expr)
- range:范围查询,
- = 等于
- <> 不等于
- > 大于
- >= 大于等于
- < 小于
- <= 小于等于
- IS NULL 是否为空
- <=> <=> NULL 相当于 IS NULL
- BETWEEN 介于起止两个点之间,包含
- LIKE 不加通配符的情况下,也相当于=
- IN 在指定集合的范围内
- index
- Extra:use Index:查询索引字段,这种情况下只扫描索引树,理论上更快
- Extra:空;例子:order by 索引字段,查询涵没有索引的字段,只是根据索引树顺序来查询数据,实际上还要从表中读取数据,所以速度理论上应该比上面那种慢
- all:最慢,全表
- possible_keys:可能用到的索引
- key:实际用到的索引
- key_len:key长度,字节
- ref:该
ref
列显示将哪些列或常量与该key
列中命名的索引进行比较,以 从表中选择行(一般显示const或者外键关联的字段) - row:预估的记录数量
- filtered:该
filtered
列指示将被表条件过滤的表行的估计百分比。最大值为100,表示没有行过滤发生。值从100减小表示过滤量增加。rows
显示检查的估计行数,rows
×filtered
显示将与下表连接的行数。例如,如果rows
为1000且filtered
为50.00(50%),则与下表连接的行数为1000×50%= 500。 - Extra:参考https://dev.mysql.com/doc/refman/8.0/en/explain-output.html#explain-extra-information (太多了,实在不想写,具体意义一般是参照其他列看,常见的应该是Use Where、Using index)