id
查询或关联查询的顺序。
如果没有子查询且只有一个查询,则为一个常数 1,表示第一步;
如果有子查询,则子查询为 1,父查询为 2;
相同的 id 查询顺序为自上而下;
如果有子查询,不同 id 值越大越先被执行;
NULL 为最后一步执行。
select_type
查询类型。
simple
查询中不包含子查询或者 UNION。
primary
查询中若包含任何复杂的子部分,最外层查询被标记为 primary。
subquery
在 SELECT 或 WHERE 列表中包含的子查询。
derived
在 FROM 列表中包含的子查询。
MySql 会递归执行这些子查询并将结果存放在临时表中。
union
若第二个 SELECT 出现在 UNION 之后则被标记为 union。
若 UNION 出现在 FROM 中的子句,外层 SELECT 被标记为 derived。
union result
从 UNION 表中获取结果的 SELECT。
dependent union
SELECT 依赖于外层 union 查询中发现的数据。
dependent subquery
SELECT 依赖于外层 subquery 查询中发现的数据。
uncacheable subquery
subquery 的 SELECT 中某些特性阻止结果被缓存。
uncacheable union
union 的 SELECT 中某些特性阻止结果被缓存。
table
表名。
type
数据访问、数据操作的类型。一般优化到 range 或 ref 级别。以下类型按性能由高到低列出。
system
全表只有一行数据。
const
只有一条符合的数据,如主键、唯一索引等。
eq_ref
唯一性索引扫描。多表关联查询中,查询主表中只有一条符合数据,如:SELECT * FROM t1 JOIN t2 ON t1.id = t2.id; 其中 t1 表的 id 为主键或唯一索引。
ref
非唯一性索引(普通索引)扫描。返回匹配某个单独值的所有行。
fulltext
全文索引。
ref_or_null
类似 ref,不同的是在检索的时候会额外搜索包含 NULL 值的记录。
index_merge
查询中使用多个索引。
unique_subquery
类似 eq_ref,不同的是用于 WHERE IN 语句。
index_subquery
类似 unique_subquery,不同的是用于非唯一索引。
range
只检索给定范围的行,使用一个索引来选择行,=、<>、>、>=、<、<=、IS NULL、BETWEEN、LIKE、IN()。
index
全索引扫描。
all
全表扫描。
possible_keys
显示可能有利于高效的查询的索引。
查询的字段若存在索引,则该索引被列出,但不一定被被实际查询使用到。
key
实际使用的索引。
如果为 NULL 则没有使用索引。
key_len
所选索引的字节长度。
显示的值为索引字段的最大可能长度,并非实际使用的长度。
在相同的查询结果下条件精度越低越好,条件越少 key_len 越小。
ref
显示与 key 一起选择行时使用的列或常数。
const
常量等值查询。
NULL
无,如 >。
具体的某一列
关联查询中被 JOIN 的哪个表中 ON 相关的字段。
func
条件时用来表达式、函数或条件列发生了内部隐式转换,
rows
扫描的行数。越少越好。
Extra
执行查询过程中对查询计划的重要补充信息。
更多详情参阅:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
Using filesort
使用了文件排序。
排序无法使用到索引时会出现,常见于 ORDER BY 和 GROUP BY 语句中。
对复合索引中字段 GROUP BY 时一般要将字段之前的字段按序加入分组条件中。
Using temporary
需要使用临时表存储结果集。
常见于 ORDER BY 和 GROUP BY 语句。
Using index
使用了覆盖索引。
查询时无需访问表的数据行,通过索引就可获取查询数据,即查询的列要被所建索引覆盖。
如果同时出现了 Using where 表明索引用来执行索引键值查找;
如果没有同时出现 Using where 表明索引用来读取数据而非执行查找。
distinct
优化 distinct 操作,在找到第一匹配元组之后即停止找相同值的动作。
Using where
使用了 WHERE 过滤。
Using join buffer
使用了 JOIN 缓存。
impossible where
WHERE 子句的值总是 false,不能用来获取任何数据。
select tables optimized away
在没有 GROUP BY 子句的情况下,基于索引优化 MIN() / MAX() 操作或对于 MyISAM 存储引擎优化 COUNT(*) 操作,不必等到执行阶段再进行计算,操作查询计划生成阶段即完成优化。