Spec-Zone.ru › MySQL 5.7

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_stmt

    SELECT связан со строкой в выводе EXPLAIN без расширенной информации, которая имеет значение id равное N.

  • outer_tables semi join (inner_tables)

    Операция полусоединения. inner_tables показывает таблицы, которые не были взяты. См. Раздел 8.2.2.1, «Оптимизация подзапросов, производных таблиц и ссылок на представления с преобразованиями полусоединений».

  • <temporary table>

    Представляет собой внутреннюю временную таблицу, созданную для кэширования промежуточного результата.

Когда некоторые таблицы имеют тип const или system, выражения, включающие столбцы из этих таблиц, вычисляются оптимизатором на ранней стадии и не являются частью отображаемого оператора. Однако с FORMAT=JSON некоторые обращения к таблицам типа const отображаются как обращения типа ref, использующие константное значение.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/explain-extended.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API