Documentation Home
MySQL 8.0 参考手册  / 第8章优化  / 8.8 了解查询执行计划  /  8.8.3 扩展的 EXPLAIN 输出格式

8.8.3 扩展的 EXPLAIN 输出格式

对于SELECT语句,该 EXPLAIN语句会产生额外的(扩展)信息,这些信息不是 EXPLAIN输出的一部分,但可以通过发出SHOW WARNINGS 后面的语句来查看EXPLAIN。输出中的 MessageSHOW WARNINGS显示优化器如何限定 SELECT语句 中的表名和列名,SELECT应用重写和优化规则后的样子,以及可能的关于优化过程的其他注释。

SHOW WARNINGS可在语句后 显示的扩展信息 EXPLAIN仅针对 SELECT语句生成。 SHOW WARNINGS显示其他可解释语句(DELETEINSERTREPLACEUPDATE)的空结果。

笔记

在较旧的 MySQL 版本中,扩展信息是使用EXPLAIN EXTENDED. 该语法仍然被识别为向后兼容,但扩展输出现在默认启用,因此该EXTENDED关键字是多余的且已弃用。它的使用会导致警告;EXPLAIN希望在未来的 MySQL 版本中将其 从 语法中删除。

以下是扩展 EXPLAIN输出的示例:

mysql> EXPLAIN
       SELECT t1.a, t1.a IN (SELECT t2.a FROM t2) FROM t1\G
*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: t1
         type: index
possible_keys: NULL
          key: PRIMARY
      key_len: 4
          ref: NULL
         rows: 4
     filtered: 100.00
        Extra: Using index
*************************** 2. row ***************************
           id: 2
  select_type: SUBQUERY
        table: t2
         type: index
possible_keys: a
          key: a
      key_len: 5
          ref: NULL
         rows: 3
     filtered: 100.00
        Extra: Using index
2 rows in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Note
   Code: 1003
Message: /* select#1 */ select `test`.`t1`.`a` AS `a`,
         <in_optimizer>(`test`.`t1`.`a`,`test`.`t1`.`a` in
         ( <materialize> (/* select#2 */ select `test`.`t2`.`a`
         from `test`.`t2` where 1 having 1 ),
         <primary_index_lookup>(`test`.`t1`.`a` in
         <temporary table> on <auto_key>
         where ((`test`.`t1`.`a` = `materialized-subquery`.`a`))))) AS `t1.a
         IN (SELECT t2.a FROM t2)` from `test`.`t1`
1 row in set (0.00 sec)

因为显示的语句SHOW WARNINGS可能包含特殊标记以提供有关查询重写或优化器操作的信息,所以该语句不一定是有效的 SQL 并且不打算执行。输出还可能包括具有值的行,这些 Message值提供有关优化器采取的操作的额外非 SQL 解释性说明。

以下列表描述了可以出现在由 显示的扩展输出中的特殊标记SHOW WARNINGS

  • <auto_key>

    为临时表自动生成的键。

  • <cache>(expr)

    表达式(例如标量子查询)执行一次,结果值保存在内存中供以后使用。对于包含多个值的结果,可能会创建一个临时表,您可能会看到<temporary table>

  • <exists>(query fragment)

    子查询谓词转换为 EXISTS谓词,子查询转换为可以与 EXISTS谓词一起使用。

  • <in_optimizer>(query fragment)

    这是一个没有用户意义的内部优化器对象。

  • <index_lookup>(query fragment)

    使用索引查找来处理查询片段以查找符合条件的行。

  • <if>(condition, expr1, expr2)

    如果条件为真,则求值为 expr1,否则 为expr2

  • <is_not_null_test>(expr)

    验证表达式不计算为 的测试 NULL

  • <materialize>(query fragment)

    使用子查询实现。

  • `materialized-subquery`.col_name

    col_name对内部临时表中 列的引用具体 化以保存评估子查询的结果。

  • <primary_index_lookup>(query fragment)

    使用主键查找来处理查询片段以查找符合条件的行。

  • <ref_null_helper>(expr)

    这是一个没有用户意义的内部优化器对象。

  • /* select#N */ select_stmt

    The SELECT is associated with the row in non-extended EXPLAIN output that has an id value of N.

  • outer_tables semi join (inner_tables)

    A semijoin operation. inner_tables shows the tables that were not pulled out. See Section 8.2.2.1, “Optimizing Subqueries, Derived Tables, and View References with Semijoin Transformations”.

  • <temporary table>

    This represents an internal temporary table created to cache an intermediate result.

当某些表属于constsystem类型时,涉及这些表中的列的表达式会由优化器及早评估,而不是显示语句的一部分。但是,对于FORMAT=JSON,某些 const表访问显示为ref使用 const 值的访问。