文档首页
MySQL 8.4 参考手册
相关文档 下载此手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  扩展 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 访问。