扩展的 EXPLAIN 输出格式
该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. , t1.IN (SELECT t2.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 Extr : 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 Extr : 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
显示未拉出的表。请参见“使用 EXISTS 策略优化子查询”。<temporary table>
这表示为缓存中间结果而创建的内部临时表。
当某些表属于const
或system
类型时,涉及这些表中的列的表达式将由优化器尽早评估,并且不属于所显示语句的一部分。但是,使用时FORMAT=JSON
,某些const
表访问将显示为ref
使用const值的访问。