Чтение плана запроса в MySQL
Чтение плана запроса (execution plan) в MySQL — это важный навык для оптимизации и понимания того, как СУБД выполняет запрос. План запроса показывает, какие индексы используются, как таблицы соединяются, и какие операции выполняются. Для анализа плана запроса используется команда EXPLAIN.
1. Как получить план запроса
Чтобы получить план запроса, добавьте ключевое слово EXPLAIN перед SQL-запросом. Например:
EXPLAIN SELECT * FROM users WHERE age > 30;
2. Основные столбцы в выводе EXPLAIN
Результат выполнения EXPLAIN содержит несколько столбцов. Вот основные из них:
| Столбец | Описание |
|--------------------|-----------------------------------------------------------------------------|
| id | Идентификатор шага выполнения. Если запрос содержит подзапросы, каждый подзапрос будет иметь свой id . |
| select_type | Тип операции SELECT . Например, SIMPLE (простой запрос), PRIMARY (основной запрос), SUBQUERY (подзапрос). |
| table | Имя таблицы, к которой относится строка. |
| partitions | Разделы таблицы, которые будут использоваться (если таблица разделена). |
| type | Тип соединения (access type). Показывает, как MySQL будет искать строки в таблице. Например, ALL (полное сканирование), index (сканирование по индексу), ref (поиск по ключу). |
| possible_keys | Возможные индексы, которые могут быть использованы для выполнения запроса. |
| key | Фактический индекс, который будет использован. |
| key_len | Длина используемого индекса (в байтах). |
| ref | Столбцы или константы, которые сравниваются с индексом. |
| rows | Оценочное количество строк, которые будут обработаны. |
| filtered | Процент строк, которые будут отфильтрованы после применения условий WHERE . |
| Extra | Дополнительная информация о выполнении запроса. Например, Using where , Using index , Using temporary , Using filesort . |
3. Расшифровка ключевых параметров
type
Extra
4. Пример анализа плана запроса
Рассмотрим пример:
EXPLAIN SELECT * FROM users WHERE age > 30 ORDER BY name;
Результат может выглядеть так:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|----|-------------|-------|------|---------------|------|---------|------|------|----------|----------------|
| 1 | SIMPLE | users | ALL | NULL | NULL | NULL | NULL | 1000 | 50.00 | Using where; Using filesort |
Анализ:
Рекомендации:
5. Использование EXPLAIN FORMAT=JSON**
Для более детального анализа можно использовать EXPLAIN FORMAT=JSON:
EXPLAIN FORMAT=JSON SELECT * FROM users WHERE age > 30;
Этот формат предоставляет расширенную информацию, включая стоимость выполнения запроса.
6. Практические советы
- Индексы: Убедитесь, что индексы используются для фильтрации и сортировки.
- Оптимизация WHERE: Упрощайте условия в WHERE, чтобы они могли использовать индексы.
- Избегайте filesort: Добавляйте индексы на столбцы, используемые в ORDER BY.
- Анализ rows: Если значение rows слишком велико, это может указывать на неэффективность запроса.
7. Пример оптимизации
Добавим индекс на столбец age:
CREATE INDEX idx_age ON users(age);
Теперь выполним EXPLAIN снова:
EXPLAIN SELECT * FROM users WHERE age > 30;
Результат:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|----|-------------|-------|-------|---------------|---------|---------|------|------|----------|-------------|
| 1 | SIMPLE | users | range | idx_age | idx_age | 4 | NULL | 500 | 100.00 | Using where |