MySQL EXPLAIN 字段说明

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(*) 操作,不必等到执行阶段再进行计算,操作查询计划生成阶段即完成优化。


本文标题:MySQL EXPLAIN 字段说明
本文链接:https://www.lanseyujie.com/post/mysql-explain-statement.html
版权声明:本文使用「署名-非商业性使用-相同方式共享」创作共享协议,转载或使用请遵守署名协议。
点赞 0 分享 0
上一篇:MySQL 双主同步
下一篇:MySQL 索引优化