使用 EXPLAIN 分析查询语句时,MySQL 会返回一系列指标字段,帮助理解查询的执行计划。以下是 EXPLAIN 输出中的所有字段及其含义,以及可能的值:

EXPLAIN 输出字段

  1. id
  2. select_type
  3. table
  4. partitions
  5. type
  6. possible_keys
  7. key
  8. key_len
  9. ref
  10. rows
  11. filtered
  12. Extra

字段解释及可能的值

  1. id

    • 标识查询中执行计划的步骤。越大表示越深的嵌套查询。
    • 通常为整数,表示执行的顺序和层级。
  2. select_type

    • 查询中每个 SELECT 的类型。
    • 可能的值:
      • SIMPLE:简单的 SELECT 查询,不包含子查询或 UNION。
      • PRIMARY:最外层的 SELECT。
      • UNION:UNION 中的第二个或后续的 SELECT 语句。
      • DEPENDENT UNION:UNION 中的第二个或后续的 SELECT 语句,依赖于外部查询。
      • UNION RESULT:用于保存 UNION 结果的 SELECT。
      • SUBQUERY:子查询中的第一个 SELECT。
      • DEPENDENT SUBQUERY:子查询中的第一个 SELECT,依赖于外部查询。
      • DERIVED:派生表(子查询的 FROM 子句)。
      • MATERIALIZED:物化子查询。
  3. table

    • 正在访问的表名或表的别名。
  4. partitions

    • 被访问的分区(如果有)。
  5. type

    • 表示查询的访问类型,显示查询优化器如何选择访问表的方法。访问类型从最佳到最差依次是:
    • system:表只有一行(系统表)。
    • const:表最多只有一行匹配(PRIMARY KEY 或 UNIQUE 索引)。
    • eq_ref:每次连接都是对主键或唯一索引进行访问。
    • ref:非唯一索引扫描。
    • fulltext:使用 FULLTEXT 索引。
    • ref_or_null:类似 ref,但可以有 NULL 值。
    • index_merge:结合索引进行扫描。
    • unique_subquery:在 IN 子查询中使用唯一索引。
    • index_subquery:在 IN 子查询中使用非唯一索引。
    • range:索引范围扫描。
    • index:全索引扫描。
    • ALL:全表扫描,效率最低。
  6. possible_keys

    • 查询中可能使用的索引列表。如果为 NULL,表示没有可用的索引。
  7. key

    • 实际使用的索引。如果为 NULL,表示没有使用索引。
  8. key_len

    • 使用的索引长度。表示索引中使用的字节数,越小越好。
  9. ref

    • 显示索引的哪一列被使用,哪些列或常量被用来查找索引列中的值。
  10. rows

    • 预估需要扫描的行数。数值越小,表示查询越高效。
  11. filtered

    • 预估的行过滤百分比。值越大越好。
  12. Extra

    • 附加信息,包含一些额外的说明。常见值包括:
      • Using index:查询覆盖索引,不需要回表。
      • Using where:使用了 WHERE 子句进行过滤。
      • Using temporary:使用了临时表,可能会影响查询效率。
      • Using filesort:使用文件排序,可能会影响查询效率。
      • Using index condition:使用了索引条件下推优化。
      • Using MRR:使用多范围读优化。
      • Using join buffer:使用连接缓冲区。
      • FirstMatch(table_name):第一次匹配表。
      • Impossible WHERE:WHERE 子句总是为 false,查询返回空结果。
      • No tables used:查询不使用任何表(例如 SELECT 1)。

示例解释

假设 EXPLAIN 输出如下:

+----+-------------+------------------+------------+-------+-------------------------------+------------+---------+------+-------+----------------------------------------------+
| id | select_type | table            | type       | key   | possible_keys                 | key_len    | ref     | rows | filtered | Extra                                      |
+----+-------------+------------------+------------+-------+-------------------------------+------------+---------+------+----------+----------------------------------------------+
| 1  | SIMPLE      | m_give_gifts_log | ref        | idx_optimized | idx_optimized  | 8          | const,const,const,const | 1000 | 100.00 | Using index condition; Using where          |
+----+-------------+------------------+------------+-------+-------------------------------+------------+---------+------+----------+----------------------------------------------+

分析结果

  1. id1 表示这个查询只有一个步骤。
  2. select_typeSIMPLE 表示这是一个简单的 SELECT 查询。
  3. tablem_give_gifts_log 表示查询的表是 m_give_gifts_log
  4. typeref 表示使用了非唯一索引扫描。
  5. possible_keysidx_optimized 表示可能使用的索引是 idx_optimized
  6. keyidx_optimized 表示实际使用的索引是 idx_optimized
  7. key_len8 表示使用了索引的长度为 8 个字节。
  8. ref:表示索引匹配的具体列。
  9. rows1000 表示预估扫描的行数是 1000 行。
  10. filtered100.00 表示预估的行过滤百分比是 100%,即所有扫描的行都符合条件。
  11. ExtraUsing index condition; Using where 表示:
    • Using index condition:MySQL 使用了索引条件下推,部分 WHERE 条件在索引扫描过程中评估。
    • Using where:MySQL 在存储引擎返回数据之后,还需要在服务器层次进行额外的过滤操作。

通过这些指标可以全面了解查询执行计划,并进一步优化查询性能。

作者:admin  创建时间:2024-07-20 18:16
最后编辑:admin  更新时间:2024-07-20 18:37