该EXPLAIN
语句会产生额外的(“扩展”)信息,这些信息不是EXPLAIN
输出的一部分, 但可以通过在SHOW WARNINGS
其后发出一条语句来查看EXPLAIN
。在MySQL 8.0.12的,扩展的信息可用于 SELECT
, DELETE
, INSERT
, REPLACE
,和 UPDATE
语句。在8.0.12之前,扩展信息仅适用于 SELECT
语句。
输出中 的Message
值 SHOW WARNINGS
显示优化器如何限定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 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*)
如果条件为true,则求值为
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* semi join (*
inner_tables*)
半联接操作。 *
inner_tables
*显示未拉出的表。请参见第8.2.2.1节“使用半联接转换优化IN和EXISTS子查询谓词”。 -
<temporary table>
这表示为缓存中间结果而创建的内部临时表。
当一些表格是const
或system
类型,包括从这些表列的表达式是由早期的优化评估,并没有显示语句的一部分。但是,使用时FORMAT=JSON
,某些 const
表访问将显示为ref
使用const值的访问。