Составной индекс не ускорил выборку по второй колонке
На таблице заказов есть индекс:
CREATE INDEX idx_orders_status_created ON orders (status, created_at);
Запрос WHERE status = 'new' AND created_at > now() - interval '1 day' летает. Новый запрос аналитики WHERE created_at > now() - interval '1 day' (без условия по статусу) снова читает всю таблицу. Почему?
- Порядок колонок в составном индексе не важен: планировщик читает его с любой колонки, а дело в устаревшей статистике
- Условие по диапазону в принципе не может использовать B-tree индекс: по `>` и `BETWEEN` доступен только полный проход
- Нужно создать два отдельных индекса по `status` и по `created_at` — PostgreSQL всегда использует оба сразу
- Нужен префикс индекса: без условия по `status` строки с нужным `created_at` не образуют диапазона в индексе
