Индекс по дате создан, но отчёт по дню по-прежнему сканирует всю таблицу
В таблице orders около 12 млн строк. По полю created_at создан btree-индекс. Отчёт за конкретный день использует запрос:
SELECT COUNT(*) FROM orders
WHERE date(created_at) = '2026-03-01';
План выполнения показывает полное сканирование таблицы — индекс не используется. Почему так происходит?
- Индекс не успел построиться после массовой загрузки: нужно пересоздать его и обновить статистику планировщика
- На таблицах больше 10 млн строк обычный btree-индекс неэффективен, требуется партиционирование по дате
- Условие наложено на функцию от поля, а индекс построен по самому полю: нужен диапазон либо индекс по выражению
- COUNT(*) всегда читает таблицу целиком, индексы для подсчёта строк не применяются ни при каких условиях
