Вступить в клуб →
сложнаявопросPostgreSQL, ORM и кэш Redis

Добавили индекс — запись замедлилась, а выборка не ускорилась

В таблицу events (около 40 млн строк, 3000 вставок в секунду) добавили индекс по колонке status, у которой всего два значения: new и processed, причём processed — примерно 97% строк.

После выкатки: вставки заметно замедлились, а запрос SELECT ... FROM events WHERE status = 'processed' LIMIT 1000 по-прежнему идёт через Seq Scan. Как это объяснить?

  • Планировщик не успел собрать статистику по новой колонке: после `ANALYZE` он начнёт использовать индекс для обоих значений
  • Селективность колонки низкая: для 97% строк последовательное чтение дешевле похода по индексу, а вставки за индекс платят
  • Индексы PostgreSQL плохо работают с текстовыми колонками из фиксированного набора значений — здесь нужен тип `enum`
  • Проблема в `LIMIT 1000`: при ограничении числа строк планировщик всегда выбирает последовательное чтение

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

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

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

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