MySQLSeniorТеория
+1 258новых вакансий за сутки90 919вакансий открыто сейчасНовое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний
EXPLAIN?EXPLAIN (и EXPLAIN ANALYZE в MySQL 8.0+) показывает тип доступа, используемые индексы и оценку строк; ключевые поля — type, key, rows, filtered, Extra — позволяют локализовать bottleneck и проверить гипотезу добавлением индекса.
-- Классический табличный вывод
EXPLAIN
SELECT o.id, c.email
FROM orders o
JOIN customers c ON c.id = o.customer_id
WHERE o.status = 'pending'
ORDER BY o.created_at DESC
LIMIT 20;
-- Древовидный формат (MySQL 8.0+)
EXPLAIN FORMAT=TREE
SELECT o.id, c.email
FROM orders o
JOIN customers c ON c.id = o.customer_id
WHERE o.status = 'pending'
ORDER BY o.created_at DESC
LIMIT 20;
-- Фактические метрики выполнения (MySQL 8.0.18+)
EXPLAIN ANALYZE
SELECT o.id, c.email
FROM orders o
JOIN customers c ON c.id = o.customer_id
WHERE o.status = 'pending'
ORDER BY o.created_at DESC
LIMIT 20;
MySQL EXPLAIN возвращает план выполнения запроса до его фактического запуска. Каждая строка соответствует одной операции (таблице или подзапросу). Анализ начинается с самых дорогих строк по полю rows.
ALL (full scan) → index → range → ref → eq_ref → const/system. Цель — избавиться от ALL на больших таблицах.NULL означает отсутствие подходящего индекса.Using filesort (лишняя сортировка), Using temporary (временная таблица), Using index (covering index — хорошо), Using where.SET GLOBAL slow_query_log = 1; SET GLOBAL long_query_time = 1;/var/log/mysql/slow.log или через pt-query-digest.EXPLAIN ANALYZE и найти строку с максимальным actual rows.type: если ALL — нужен индекс или переписывание запроса.Extra: Using filesort — добавить индекс на ORDER BY; Using temporary — пересмотреть GROUP BY или подзапрос.EXPLAIN ANALYZE, сравнить фактические метрики.-- Статистика ожиданий InnoDB (MySQL 8.0, performance_schema)
SELECT EVENT_NAME, COUNT_STAR, SUM_TIMER_WAIT/1e12 AS total_sec
FROM performance_schema.events_waits_summary_global_by_event_name
WHERE COUNT_STAR > 0
ORDER BY SUM_TIMER_WAIT DESC
LIMIT 10;
-- Текущие блокировки
SELECT * FROM performance_schema.data_locks\G
ANALYZE TABLE перед диагностикой.FORCE INDEX(idx_name) для проверки гипотезы.(a, b, c) будет использован только до первого диапазонного условия; WHERE a=1 AND b>5 AND c=3 задействует только (a, b).EXPLAIN для UNION показывает несколько строк с <union1,2>; легко упустить дорогой шаг.FORMAT=JSON и FORMAT=TREE доступны только в MySQL 8.0+; на 5.7 выбросит синтаксическую ошибку.UPDATE, DELETE) EXPLAIN ANALYZE фактически выполняет операцию внутри транзакции, которую автоматически откатывает; не запускайте в production без осознания этого.