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