Вопрос с собеседования · Базы данных

Каков основной эффект добавления индекса по столбцу?

JuniorИндексы и планы запросовSQL
Ещё спрашивают так:
  • Зачем нужны индексы?
  • Чем плохо много индексов?
Коротко

Индекс — отдельная упорядоченная структура (обычно 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) индекс?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования