EXPLAIN
语句会生成一些额外的 (“扩展”) 信息,这些信息不是 EXPLAIN
输出的一部分,但可以通过在 EXPLAIN
之后发出 SHOW WARNINGS
语句来查看。扩展信息适用于 SELECT
、DELETE
、INSERT
、REPLACE
和 UPDATE
语句。
在 SHOW WARNINGS
输出中,Message
值显示了优化器如何在 SELECT
语句中限定表名和列名,在应用重写和优化规则后 SELECT
的样子,以及可能有关优化过程的其他说明。
在 EXPLAIN
之后使用 SHOW WARNINGS
语句显示的扩展信息仅适用于 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
值的行,这些值提供了有关优化器采取的行动的其他非 SQL 说明性说明。
以下列表描述了在 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>(
查询片段
)使用主键查找来处理查询片段,以查找符合条件的行。
<ref_null_helper>(
表达式
)这是一个内部优化器对象,对用户没有意义。
/* select#
N
*/select_stmt
此
SELECT
与非扩展EXPLAIN
输出中id
值为N
的行相关联。外部表
半连接 (内部表
)半连接操作。
内部表
显示了未被提取的表。请参见 使用半连接转换优化 IN 和 EXISTS 子查询谓词.<临时表>
这表示一个内部临时表,用于缓存中间结果。
当某些表是 const
或 system
类型时,优化器会提前评估涉及这些表中列的表达式,并且它们不会成为显示语句的一部分。但是,使用 FORMAT=JSON
时,某些 const
表访问会显示为使用常量值的 ref
访问。