Влияют ли индексы на другие запросы кроме ускорения поиска
Что проверяют
Видите ли вы индекс целиком: он ускоряет не только SELECT, но и замедляет запись, занимает память и влияет на блокировки. Следом часто спрашивают, как вы добавите индекс на живую таблицу под нагрузкой.
Как отвечать
Ответ «да, и в обе стороны». Где индекс помогает помимо поиска:
UPDATEиDELETEс условием: строки для изменения тоже надо найти, без индекса это полный скан;JOINи внешние ключи: индекс на колонке внешнего ключа ускоряет соединения и удаление из родительской таблицы, иначе база сканирует дочернюю на каждую удалённую строку;ORDER BY ... LIMIT: B-tree отдаёт строки уже отсортированными;- index-only scan: если все нужные колонки есть в индексе, таблицу можно не читать;
- ограничения: уникальный индекс обеспечивает
UNIQUE, без него не работаетINSERT ... ON CONFLICT.
Где мешает:
- запись: каждый
INSERTпишет во все индексы таблицы, растёт объём WAL. В PostgreSQL изменение индексированной колонки лишаетUPDATEоптимизации HOT, и новые записи появляются во всех индексах; - память: индексы конкурируют с данными за
shared_buffers, лишние вытесняют полезные страницы; - обслуживание: bloat, работа для autovacuum, а обычный
CREATE INDEXблокирует запись на время построения.
Из Go-практики: массовую загрузку через pgx и CopyFrom индексы заметно тормозят, а CREATE INDEX CONCURRENTLY нельзя выполнить внутри транзакции, поэтому в goose такую миграцию помечают -- +goose NO TRANSACTION. Проверяют всё через EXPLAIN (ANALYZE, BUFFERS) и pg_stat_user_indexes, где видно индексы, которые никто не читает.
Где спотыкаются
Отвечают только про вставку. Интервьюер ждёт и обратной стороны: индексы ускоряют UPDATE, DELETE и соединения, а без индекса на внешнем ключе удаление родителя превращается в серию сканов.
Считают, что планировщик всегда выберет индекс. При низкой селективности или устаревшей статистике он справедливо читает таблицу целиком, а неудачный индекс может увести план не туда.
Создают индекс на большой таблице обычной миграцией в рабочее время и получают остановленную запись.