Вступить в клуб →
средняявопросPostgreSQL и Redis: запросы и кэш

Составной индекс не ускорил выборку по второй колонке

На таблице заказов есть индекс:

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` не образуют диапазона в индексе

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

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

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

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