10.8.3 Расширенный формат вывода EXPLAIN
Оператор EXPLAIN производит дополнительную (“расширенную”) информацию, которая не входит в вывод EXPLAIN, но может быть просмотрена с помощью оператора SHOW WARNINGS после EXPLAIN. Расширенная информация доступна для операторов SELECT, DELETE, INSERT, REPLACE и UPDATE.
Значение 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)Если условие истинно, вычислить
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_stmtSELECTсвязано со строкой в выводеEXPLAINбез расширения, имеющей значениеidN. -
outer_tablessemi join (inner_tables)Операция полусоединения.
inner_tablesпоказывает таблицы, которые не были извлечены. См. . -
<temporary table>Это представляет собой внутреннюю временную таблицу, созданную для кэширования промежуточного результата.
Когда некоторые таблицы имеют тип const или system, выражения, включающие столбцы из этих таблиц, оцениваются оптимизатором на ранней стадии и не входят в отображаемый оператор. Однако с помощью FORMAT=JSON некоторые обращения к таблицам const отображаются как доступ ref, использующий постоянное значение.
© 2025 Oracle
Licensed under the GPLv2 License.