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://lanseyujie.com/post/mysql-explain-statement.html
    版权声明:本文使用「署名-非商业性使用-相同方式共享」创作共享协议,转载或使用请遵守署名协议。
    点赞 0 分享 0
    上一篇:MySQL 双主同步
    下一篇:MySQL 索引优化