Добавили индекс — запись замедлилась, а выборка не ускорилась
В таблицу events (около 40 млн строк, 3000 вставок в секунду) добавили индекс по колонке status, у которой всего два значения: new и processed, причём processed — примерно 97% строк.
После выкатки: вставки заметно замедлились, а запрос SELECT ... FROM events WHERE status = 'processed' LIMIT 1000 по-прежнему идёт через Seq Scan. Как это объяснить?
- Планировщик не успел собрать статистику по новой колонке: после `ANALYZE` он начнёт использовать индекс для обоих значений
- Селективность колонки низкая: для 97% строк последовательное чтение дешевле похода по индексу, а вставки за индекс платят
- Индексы PostgreSQL плохо работают с текстовыми колонками из фиксированного набора значений — здесь нужен тип `enum`
- Проблема в `LIMIT 1000`: при ограничении числа строк планировщик всегда выбирает последовательное чтение
