10.8.3 扩展 EXPLAIN 输出格式
EXPLAIN 语句生成额外的(““扩展”)信息,这些信息不属于EXPLAIN 输出,但可以通过在EXPLAIN后面使用SHOW WARNINGS 语句来查看。扩展信息可用于SELECT、DELETE、INSERT、REPLACE 和UPDATE 语句。
在SHOW WARNINGS输出中,Message值显示了优化器如何对表名和列名进行限定,以及SELECT语句经过重写和优化规则后的样子,可能还有关于优化过程的其他信息。
使用SHOW WARNINGS语句后跟EXPLAIN,只生产SELECT语句的扩展信息。对于其他可解释语句(DELETE、INSERT、REPLACE和UPDATE),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_stmtSELECT 语句与非扩展
EXPLAIN输出中的行相关联,id值为N。 -
outer_tables半连接 (inner_tables)半连接操作。
inner_tables显示了未被提取的表。请参阅使用半连接转换优化 IN 和 EXISTS 子查询谓词。 -
<临时表>这表示一个内部临时表,用于缓存中间结果。
当某些表是const 或 system 类型时,涉及这些表的表达式由优化器早期评估,不是显示语句的一部分。然而,在使用 FORMAT=JSON 时,某些const 表访问将被显示为使用 const 值的ref 访问。