10.8.3 扩展 EXPLAIN 输出格式
EXPLAIN
语句生成额外的(““扩展”)信息,这些信息不属于EXPLAIN
输出,但可以通过在EXPLAIN
后面使用SHOW WARNINGS
语句来查看。扩展信息可用于SELECT
、DELETE
、INSERT
、REPLACE
和UPDATE
语句。
在SHOW WARNINGS
输出中,Message
值显示了优化器如何对表名和列名进行限定,以及SELECT
语句经过重写和优化规则后的样子,可能还有关于优化过程的其他信息。
使用SHOW WARNINGS
语句后跟EXPLAIN
,只生产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
值的行,用于解释优化器采取的操作。
以下列表描述了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>(
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
表访问将被显示为使用 const 值的ref
访问。