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)
Отсортированы от лучших к худшим по производительности:
- system: В таблице только одна строка (системная таблица).
- const: В таблице не более одной совпадающей строки (например, поиск по первичному ключу).
- eq_ref: Для каждой комбинации строк из предыдущих таблиц читается одна строка из этой таблицы (уникальный индекс).
- ref: Читаются все строки с совпадающими значениями индекса (неуникальный индек с).
- fulltext: Соединение выполняется с использованием индекса
FULLTEXT. - ref_or_null: Похоже на
ref, но дополнительно ищет строки сNULL. - index_merge: Используется оптимизация Index Merge (слияние индексов).
- unique_subquery: Для подзапросов
IN, возвращающих уникальные результаты. - index_subquery: Для подзапросов
IN, возвращающих неуникальные результаты. - range: Извлекаются только строки в заданном диапазоне с использованием индекса.
- index: Полное сканирование индекса.
- 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 на максималках