Индекс по колонке статуса не ускорил чтение и замедлил запись
Таблица payments содержит около 30 млн строк, в неё идёт интенсивная вставка. В колонке status три значения, причём примерно 95% строк имеют значение DONE.
Чтобы ускорить отчёт SELECT ... FROM payments WHERE status = 'DONE', добавили индекс по status. После выката отчёт быстрее не стал (в плане по-прежнему Seq Scan), а вставки заметно замедлились.
Что здесь произошло?
- Индекс не используется, потому что после его создания не выполнили VACUUM FULL и таблица осталась раздутой
- Под условие подходит 95% строк: индекс почти ничего не отсекает, поэтому планировщик выбирает Seq Scan, но поддерживать его при каждой вставке всё равно нужно
- Индекс начнёт использоваться, если дописать в запрос ORDER BY status — тогда планировщик получит подходящий порядок чтения
- Seq Scan в плане всегда означает ошибку конфигурации: планировщику не хватает памяти на индексное чтение
- Замедление вставок вызвано не индексом, а блокировкой, которую удерживает отчёт при последовательном чтении таблицы
