План запроса (EXPLAIN)
EXPLAIN показывает, как именно база собирается выполнить запрос — какой путь выберет: полный перебор таблицы или использует индекс, в каком порядке будет соединять таблицы в JOIN. Это главный инструмент диагностики “почему запрос медленный”.
EXPLAIN SELECT * FROM users WHERE email = 'artur@mail.ru';
Seq Scan on users (cost=0.00..18.50 rows=1 width=64)
Filter: (email = 'artur@mail.ru'::text)
Seq Scan — последовательное сканирование, значит индекс не используется — на большой таблице это сигнал, что стоит добавить индекс.
Копнуть глубже
После добавления индекса план меняется:
Index Scan using idx_users_email on users (cost=0.29..8.31 rows=1 width=64)
Index Cond: (email = 'artur@mail.ru'::text)
Index Scan вместо Seq Scan — теперь база использует индекс, и cost (условная стоимость выполнения) сильно меньше.
EXPLAIN ANALYZE — то же самое, но реально выполняет запрос и показывает фактическое время:
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'artur@mail.ru';
Разница важна: обычный EXPLAIN показывает предполагаемый план (на основе статистики базы), ANALYZE — что произошло на самом деле. Иногда они расходятся — это сигнал, что статистика базы устарела (нужно обновить через ANALYZE users; — без EXPLAIN).
• разницу между EXPLAIN и EXPLAIN ANALYZE (если дошёл до 2-го слоя).