扩展的 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值的访问。
