Вопрос проверяет, понимаешь ли ты, что индексы не всегда полезны и в ряде случаев могут вредить производительности системы.
Индексы ухудшают производительность, когда их слишком много, когда они созданы не под реальные запросы или когда данные часто записываются. Каждый индекс замедляет INSERT, UPDATE и DELETE. Также индекс может быть бесполезен при низкой селективности данных. В таких случаях БД тратит ресурсы на обслуживание индекса, не получая выгоды при чтении.
Хотя индексы ассоциируются с ускорением, на практике они могут стать источником серьезных проблем, если использовать их без анализа нагрузки.
Index overhead — накладные расходы на поддержку индексов, которые могут превышать их пользу.
Если таблица:
часто получает INSERT;
активно обновляется;
используется для логов или событий,
то каждый дополнительный индекс:
увеличивает время записи;
усиливает блокировки;
повышает нагрузку на диск.
Индекс плохо работает, если:
в колонке мало уникальных значений;
условие возвращает большую часть таблицы.
Пример:
индекс по is_active, где 95% строк имеют true.
Результат:
планировщик может игнорировать индекс;
ресурсы на его поддержку всё равно тратятся.
Частая ошибка:
индекс создан «на будущее»;
запросов под него нет или почти нет.
Последствия:
рост размера БД;
замедление записи без выигрыша в чтении.
Проблемы возникают, когда:
порядок колонок не соответствует запросам;
используются выражения, не совпадающие с индексом.
В итоге:
индекс есть;
БД делает Seq Scan.
Индексы ухудшают производительность, если они не соответствуют реальным запросам или если нагрузка ориентирована на запись. Индекс должен существовать только тогда, когда он действительно используется.