План выполнения запроса: какой алгоритм JOIN (hash, merge, nested loop), какие индексы используются, объём прочитанных строк. EXPLAIN ANALYZE дополнительно выполняет запрос и показывает реальное время и фактическое число строк — расхождение оценки с фактом часто и есть причина тормозов.
На колонках, по которым часто фильтруют (WHERE) или джоинятся (ON). НЕ нужен на маленьких таблицах (до 10 тыс. строк) и при низкой селективности (boolean на 50/50). Лишние индексы замедляют запись.
WHERE DATE(created_at) = ... или WHERE lower(email) = ... делают условие non-sargable: обычный индекс по колонке не подходит, идёт полный скан. Решение — переписать без функции на колонке (created_at в диапазоне) или создать индекс по выражению.
Пре-агрегация (материализованная view или сводная таблица по расписанию), партиционирование по дате с pruning, колоночное хранилище (ClickHouse, агрегатные движки). На строковой СУБД полный пересчёт по 100 млн строк каждый раз — это всегда медленно.
VIEW — сохранённый запрос, выполняется каждый раз заново. MATERIALIZED VIEW — сохранённый результат, обновляется по расписанию или вручную: быстрое чтение ценой того, что данные могут устаревать между обновлениями.
Агрегации · JOIN-запросы · Оконные функции · CTE (Common Table Expressions) · Подзапросы · Работа с датами · Строковые функции · Условная логика
Открыть весь SQL-тренажёр (576 задач) →