Ответ
Обе команды используются для анализа и оптимизации SQL-запросов, но работают принципиально по-разному.
EXPLAIN
- Что делает: Показывает предполагаемый план выполнения запроса, который строит планировщик СУБД.
- Не выполняет запрос: Команда не обращается к данным, а лишь моделирует, как бы она это сделала. Это делает её мгновенной и безопасной для любой среды.
- Что показывает: Типы сканирования (Seq Scan, Index Scan), методы соединения таблиц (Nested Loop, Hash Join), предполагаемую стоимость и количество строк.
- Когда использовать: Для быстрой проверки, используются ли индексы, и для общего понимания логики выполнения запроса.
EXPLAIN ANALYZE
- Что делает: Реально выполняет запрос и показывает план, дополненный фактическими данными о выполнении.
- Выполняет запрос: Это может быть медленно и ресурсозатратно. Для запросов, изменяющих данные (
INSERT
,UPDATE
,DELETE
), изменения будут применены, если не обернуть команду в транзакцию сROLLBACK
. - Что показывает: Всё то же, что и
EXPLAIN
, плюс:- Реальное время выполнения каждого узла плана (в миллисекундах).
- Фактическое количество строк, прошедших через каждый узел.
- Когда использовать: Для точной диагностики производительности, когда предполагаемый план сильно расходится с реальностью. Идеально для поиска "узких мест" в запросе.
Пример:
-- Показывает только теоретический план
EXPLAIN SELECT * FROM users WHERE id = 1;
-- Выполняет запрос и показывает план с реальными метриками
EXPLAIN ANALYZE SELECT * FROM users WHERE id = 1;
Итог: EXPLAIN
— это теория (как должно быть), EXPLAIN ANALYZE
— это практика (как было на самом деле). Начинайте с EXPLAIN
, и если его вывода недостаточно для оптимизации, используйте EXPLAIN ANALYZE
с осторожностью.