该 EXPLAIN 语句产生额外的(“扩展”)信息,该信息不是 EXPLAIN 输出的一部分,但可以通过发出 SHOW WARNINGS 语句来查看该信息,后跟 EXPLAIN。扩展信息适用于 SELECT、DELETE、INSERT、REPLACE 和 UPDATE 语句。
在 SHOW WARNINGS 输出中,Message 值显示了优化器如何限定表和列名在 SELECT 语句中,SELECT 语句在应用重写和优化规则后是什么样的,可能还有其他关于优化过程的注释。
使用 SHOW WARNINGS 语句后跟 EXPLAIN 可以显示的扩展信息仅适用于 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 警告 显示的语句可能包含特殊标记,以提供关于查询重写或优化器操作的信息,该语句不一定是有效的 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 子查询谓词。 -
<临时表>这表示创建了一个内部临时表,以缓存中间结果。
当某些表为 const 或 system 类型时,涉及这些表的列的表达式将被优化器提前评估,不是显示语句的一部分。然而,使用 FORMAT=JSON,某些 const 表访问将显示为使用常量值的 ref 访问。