Как оптимизировать медленный запрос?

Оптимизация медленного запроса обычно начинается с анализа плана выполнения, индексов и объёма данных, которые реально читает СУБД. Часто помогают EXPLAIN ANALYZE, пересмотр условий WHERE, корректные индексы, уменьшение JOIN и предварительная фильтрация строк.
Подробный ответ

С чего начать

Если запрос медленный, сначала надо понять, где именно теряется время. Для этого смотрят план выполнения, количество строк, использование индексов и объём данных, который проходит через каждый шаг.

Основные шаги

  1. Посмотреть EXPLAIN ANALYZE и понять, какой узел плана самый дорогой.

  2. Проверить индексы — есть ли индекс по полям из WHERE, JOIN и ORDER BY.

  3. Сократить объём данных — фильтровать строки раньше, до тяжёлых соединений и агрегаций.

  4. Переписать запрос — иногда подзапрос, JOIN или CTE будет работать лучше.

  5. Проверить статистику — СУБД должна иметь актуальные данные о распределении строк.

Что обычно помогает

  • создать или изменить индекс;

  • убрать лишние JOIN;

  • не использовать функции на индексируемом столбце, если это ломает использование индекса;

  • ограничить выборку через более точный WHERE;

  • избежать выборки лишних столбцов через SELECT *.

Пример мышления

Если запрос ищет пользователя по email, но делает Seq Scan, я проверю индекс по email, сравнение с LOWER(email), актуальность статистики и то, не мешает ли тип данных использовать индекс.

Как ответить на собеседовании

Я начинаю с EXPLAIN ANALYZE, смотрю на самый дорогой узел, потом проверяю индексы, фильтрацию, JOIN и статистику. Обычно медленный запрос ускоряется либо правильным индексом, либо переписыванием запроса так, чтобы СУБД читала меньше данных.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге