Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Extended EXPLAIN Output Format

10.8.3 扩展的 EXPLAIN 输出格式

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

SHOW WARNINGS 输出中,Message 值显示了优化器如何限定表和列名在 SELECT 语句中,SELECT 语句在应用重写和优化规则后是什么样的,可能还有其他关于优化过程的注释。

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

以下是一个扩展的 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 警告 显示的语句可能包含特殊标记,以提供关于查询重写或优化器操作的信息,该语句不一定是有效的 SQL 且不打算执行。输出也可能包括带有 消息 值的行,这些值提供了优化器采取的操作的附加非 SQL 解释性注释。

以下列表描述了 SHOW 警告 显示的扩展输出中的特殊标记:

  • <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

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

  • outer_tables 半连接 (inner_tables)

    半连接操作。inner_tables 显示未被提取的表格。请参阅 使用半连接变换优化 IN 和 EXISTS 子查询谓词

  • <临时表>

    这表示创建了一个内部临时表,以缓存中间结果。

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