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

8.8.3 扩展的 EXPLAIN 输出格式

EXPLAINEXTENDED关键字一起使用时,输出包括一 filtered列,否则不会显示。此列指示按表条件过滤的表行的估计百分比。

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

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

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

mysql> EXPLAIN EXTENDED
       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, `materialized subselect`.col_name

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

  • <primary_index_lookup>(query fragment)

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

  • <ref_null_helper>(expr)

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

  • /* select#N */ select_stmt

    SELECT与非扩展EXPLAIN输出中id值为 的行关联N

  • outer_tables semi join (inner_tables)

    半连接操作。 inner_tables显示未拉出的表。请参阅第 8.2.2.1 节,“使用半连接转换优化子查询”

  • <temporary table>

    这表示为缓存中间结果而创建的内部临时表。

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