Skip to main content

3.扩展 EXPLAIN 输出格式

EXPLAIN 语句产生额外的(“扩展”)信息,这些信息不是 EXPLAIN 输出的一部分,但可以通过在 EXPLAIN 之后发出 SHOW WARNINGS 语句来查看。 扩展信息可用于 SELECT、DELETE、INSERT、REPLACE 和 UPDATE 语句。

SHOW WARNINGS 输出中的 Message 值显示优化器如何限定 SELECT 语句中的表名和列名、应用重写和优化规则后 SELECT 的外观,以及可能有关优化过程的其他注释。

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

以下是扩展 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</code></em>) 子查询谓词将转换为 EXISTS 谓词,并且子查询将被转换,以便它可以与 EXISTS 谓词一起使用。
  • <in_optimizer>(query fragment) 这是一个内部优化器对象,对用户没有意义。
  • <index_lookup>(query fragment) 使用索引查找来处理查询片段以查找符合条件的行。
  • <if>(condition,expr1,expr2) 如果条件为 true,则计算 expr1,否则计算 expr2。
  • <is_not_null_test>(expr) 验证表达式的计算结果不为 NULL 的测试。
  • <materialize>(query fragment) 使用子查询具体化。
  • ``materialized-subquery .col_name 对内部临时表中列 col_name 的引用具体化以保存子查询的计算结果。
  • <ref_null_helper>( *expr * ) 使用主键查找来处理查询片段以查找符合条件的行。
  • <ref_null_helper>(expr) 这是一个内部优化器对象,对用户没有意义。
  • /* select#N */ select_stmt SELECT 与非扩展 EXPLAIN 输出中 id 值为 N 的行关联。
  • uter_tables semi join ( inner_tables ) 半连接操作。 inner_tables 显示未拉出的表。 请参阅使用半连接转换优化 IN 和 EXISTS 子查询谓词。
  • <temporary table> 这表示为缓存中间结果而创建的内部临时表。

当某些表是 const 或系统类型时,涉及这些表中的列的表达式会由优化器提前计算,并且不是显示语句的一部分。 但是,使用 FORMAT=JSON 时,某些常量表访问将显示为使用常量值的引用访问。