Spec-Zone.ru › MySQL 9.2

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_stmt

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

  • outer_tables semi join (inner_tables)

    Операция полусоединения. inner_tables показывает таблицы, которые не были извлечены. См. .

  • <temporary table>

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

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

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

Spec-Zone.ru

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