Каков основной эффект добавления индекса по столбцу?
- Зачем нужны индексы?
- Чем плохо много индексов?
Индекс — отдельная упорядоченная структура (обычно B-дерево): поиск по колонке за O(log n) вместо полного просмотра таблицы. Цена — медленнее запись и больше места.
- Ускоряет WHERE, JOIN, ORDER BY по индексированным колонкам
- Каждый INSERT/UPDATE/DELETE обновляет все индексы таблицы
- Уникальный индекс заодно гарантирует уникальность
А ещё Индекс не используется, если выбирается большая доля строк — полный просмотр дешевле
Подробно
Как работает. Без индекса база читает всю таблицу (sequential scan) и проверяет каждую строку. Индекс хранит значения колонки в отсортированном виде со ссылками на строки; поиск значения — спуск по B-дереву за несколько чтений страниц. На таблице в 100 млн строк разница — миллисекунды против минут.
Что ускоряет: точный поиск и диапазоны в WHERE, соединения по ключу, сортировку (если порядок совпадает с индексом), MIN/MAX, проверку уникальности.
Цена:
- каждая вставка, изменение индексированной колонки и удаление обновляют все индексы таблицы — запись медленнее, больше WAL;
- место на диске и в памяти (индексы конкурируют с данными за кэш);
- лишние индексы мешают HOT-обновлениям в PostgreSQL и замедляют VACUUM.
Когда индекс не поможет: запрос выбирает большую долю таблицы (дешевле прочитать всё подряд), функция от колонки без функционального индекса, LIKE '%abc', несоответствие типов, низкая селективность (колонка пола).
Практика: создавать индексы под реальные запросы, проверять по EXPLAIN, удалять неиспользуемые (pg_stat_user_indexes), на больших таблицах — CREATE INDEX CONCURRENTLY.
Пример
EXPLAIN SELECT * FROM orders WHERE customer_id = 42;
-- Seq Scan on orders (cost=0.00..180000.00 rows=12)
CREATE INDEX CONCURRENTLY orders_customer_idx ON orders(customer_id);
-- Index Scan using orders_customer_idx (cost=0.43..50.12 rows=12)Что хотят услышать
- Что такое индекс и почему поиск быстрее.
- Цена: запись и место.
- Когда индекс не используется.
Частые ошибки
- «Индексы на все колонки на всякий случай».
- Ожидать ускорения от индекса на колонке с двумя значениями.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Уменьшает физический размер таблицы
- ✗Ускоряет и выборки по столбцу, и вставки в таблицу, так как строки находятся быстрее
- ✗Всегда гарантирует уникальность значений столбца
- ✓Ускоряет выборки по столбцу, но замедляет запись и занимает место
Что спросят дальше
- Когда индекс не используется оптимизатором?
- Что такое составной (composite) индекс?
Разбор темы
- Индексы и планы запросов
Устройство B-tree, hash vs B-tree, составной и covering индекс, цена записи и когда индекс не используется.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.