Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

10.8.3 扩展 EXPLAIN 输出格式

EXPLAIN 语句生成额外的(““扩展”)信息,这些信息不属于EXPLAIN 输出,但可以通过在EXPLAIN后面使用SHOW WARNINGS 语句来查看。扩展信息可用于SELECTDELETEINSERTREPLACEUPDATE 语句。

SHOW WARNINGS输出中,Message值显示了优化器如何对表名和列名进行限定,以及SELECT语句经过重写和优化规则后的样子,可能还有关于优化过程的其他信息。

使用SHOW WARNINGS语句后跟EXPLAIN,只生产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 值的行,用于解释优化器采取的操作。

以下列表描述了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>(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 表访问将被显示为使用 const 值的ref 访问。