文档首页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  扩展 EXPLAIN 输出格式

10.8.3 扩展 EXPLAIN 输出格式

EXPLAIN 语句会产生一些额外的 (扩展) 信息,这些信息不是 EXPLAIN 输出的一部分,但可以通过在 EXPLAIN 之后发出 SHOW WARNINGS 语句来查看。扩展信息适用于 SELECTDELETEINSERTREPLACEUPDATE 语句。

SHOW WARNINGS 输出中的 Message 值显示了优化器如何在 SELECT 语句中限定表和列名、SELECT 在应用重写和优化规则之后的最终样子,以及有关优化过程的其他说明。

EXPLAIN 之后使用 SHOW WARNINGS 语句显示的扩展信息仅适用于 SELECT 语句。对于其他可解释语句 (DELETEINSERTREPLACEUPDATE),SHOW WARNINGS 会显示空结果。

以下是扩展 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>(查询片段)

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

  • <ref_null_helper>(表达式)

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

  • /* select#N */ select_stmt

    SELECT 与非扩展 EXPLAIN 输出中的行相关联,该行具有 id 值为 N

  • 外部表 半连接 (内部表)

    半连接操作。 内部表 显示未提取的表。请参见 使用半连接转换优化 IN 和 EXISTS 子查询谓词.

  • <临时表>

    这表示一个内部临时表,用于缓存中间结果。

当某些表为 constsystem 类型时,涉及这些表的列的表达式将由优化器提前评估,并且不属于显示的语句的一部分。但是,使用 FORMAT=JSON,一些 const 表访问将显示为 ref 访问,该访问使用常量值。