Составной индекс (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
- Порядок колонок в составном индексе значения не имеет: годится любая из них, а проблема в устаревшей статистике — поможет её пересбор
- Составные индексы применяются только тогда, когда в условии есть точное равенство сразу по всем входящим в них колонкам, а здесь равенства нет
