EXPLAIN ANALYZE, пересмотр условий WHERE, корректные индексы, уменьшение JOIN и предварительная фильтрация строк.
EXPLAIN ANALYZE, пересмотр условий WHERE, корректные индексы, уменьшение JOIN и предварительная фильтрация строк.
С чего начать
Если запрос медленный, сначала надо понять, где именно теряется время. Для этого смотрят план выполнения, количество строк, использование индексов и объём данных, который проходит через каждый шаг.
Основные шаги
Посмотреть EXPLAIN ANALYZE и понять, какой узел плана самый дорогой.
Проверить индексы — есть ли индекс по полям из WHERE, JOIN и ORDER BY.
Сократить объём данных — фильтровать строки раньше, до тяжёлых соединений и агрегаций.
Переписать запрос — иногда подзапрос, JOIN или CTE будет работать лучше.
Проверить статистику — СУБД должна иметь актуальные данные о распределении строк.
Что обычно помогает
создать или изменить индекс;
убрать лишние JOIN;
не использовать функции на индексируемом столбце, если это ломает использование индекса;
ограничить выборку через более точный WHERE;
избежать выборки лишних столбцов через SELECT *.
Пример мышления
Если запрос ищет пользователя по email, но делает Seq Scan, я проверю индекс по email, сравнение с LOWER(email), актуальность статистики и то, не мешает ли тип данных использовать индекс.
Как ответить на собеседовании
Я начинаю с EXPLAIN ANALYZE, смотрю на самый дорогой узел, потом проверяю индексы, фильтрацию, JOIN и статистику. Обычно медленный запрос ускоряется либо правильным индексом, либо переписыванием запроса так, чтобы СУБД читала меньше данных.
Оцени свой прогресс