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

8.8.3 扩展的 EXPLAIN 输出格式

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

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

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

以下是扩展 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>

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

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