Вступить в клуб →
средняявопросSQL и оптимизация запросов

Составной индекс (client_id, created_at) и фильтр только по дате

На таблице orders создан составной индекс по (client_id, created_at). Запрос личного кабинета клиента работает быстро, а вот отчёт бухгалтерии — нет:

SELECT id, total
FROM orders
WHERE created_at BETWEEN '2026-03-01' AND '2026-03-31';

EXPLAIN на этом запросе показывает полный проход по таблице. Почему?

  • BETWEEN по датам всегда приводит к полному проходу, потому что границы вычисляются на лету; нужно заменить его на пару условий с >= и <
  • Составной индекс используется слева направо: без условия по client_id ведущая колонка не задана, и для этого фильтра нужен отдельный индекс по created_at
  • Порядок колонок в составном индексе значения не имеет: годится любая из них, а проблема в устаревшей статистике — поможет её пересбор
  • Составные индексы применяются только тогда, когда в условии есть точное равенство сразу по всем входящим в них колонкам, а здесь равенства нет

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела