Перейти к основному содержимому

EXPLAIN в MySQL

Команда EXPLAIN предоставляет информацию о том, как MySQL выполняет запрос. Она работает с операторами SELECT, DELETE, INSERT, REPLACE и UPDATE.

Основные столбцы вывода EXPLAIN​

СтолбецОписание
idПорядковый номер каждого SELECT внутри запроса.
select_typeТип запроса (например, SIMPLE, PRIMARY, SUBQUERY, DERIVED, UNION).
tableНазвание таблицы, к которой относится строка вывода.
partitionsПартиции, из которых будут выбираться данные.
typeТип соединения (как MySQL выбирает данные). Критически важен для производительности.
possible_keysИндексы, которые MySQL может использовать для поиска строк.
keyИндекс, который MySQL фактически решил использовать.
key_lenДлина выбранного ключа в байтах.
refСтолбцы или константы, которые сравниваются с индексом, указанным в key.
rowsОценочное количество строк, которые MySQL должен просмотреть.
filteredПроцент строк, отфильтрованных условием таблицы.
ExtraДополнительная информация о том, как MySQL разрешает запрос.

Типы соединений (столбец type)​

Отсортированы от лучших к худшим по производительности:

  1. system: В таблице только одна строка (системная таблица).
  2. const: В таблице не более одной совпадающей строки (например, поиск по первичному ключу).
  3. eq_ref: Для каждой комбинации строк из предыдущих таблиц читается одна строка из этой таблицы (уникальный индекс).
  4. ref: Читаются все строки с совпадающими значениями индекса (неуникальный индекс).
  5. fulltext: Соединение выполняется с использованием индекса FULLTEXT.
  6. ref_or_null: Похоже на ref, но дополнительно ищет строки с NULL.
  7. index_merge: Используется оптимизация Index Merge (слияние индексов).
  8. unique_subquery: Для подзапросов IN, возвращающих уникальные результаты.
  9. index_subquery: Для подзапросов IN, возвращающих неуникальные результаты.
  10. range: Извлекаются только строки в заданном диапазоне с использованием индекса.
  11. index: Полное сканирование индекса.
  12. ALL: Полное сканирование таблицы (самый медленный вариант).

Важные значения в столбце "Extra"​

  • Using index: Запрос разрешается только с использованием индекса (покрывающий индекс).
  • Using where: Используется условие WHERE для фильтрации строк после их получения из движка хранения.
  • Using temporary: MySQL необходимо создать временную таблицу для хранения результата (часто для GROUP BY или ORDER BY).
  • Using filesort: MySQL должен выполнить дополнительный проход, чтобы найти способ извлечь строки в отсортированном порядке.
  • Select tables optimized away: Оптимизатор определил, что доступ к таблицам не требуется (например, MIN() по индексированному столбцу).

Современные возможности MySQL (8.0+)​

  • EXPLAIN FORMAT=TREE: Выводит план выполнения в виде иерархического дерева со стоимостью операций.
  • EXPLAIN ANALYZE: Выполняет запрос и выводит фактическое время и количество строк вместе с оценками.

Источник: Habr - Читаем EXPLAIN на максималках