Получить доступ

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

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

Индекс — отдельная упорядоченная структура (обычно B-дерево): поиск по колонке за O(log n) вместо полного просмотра таблицы. Цена — медленнее запись и больше места.

  • Ускоряет WHERE, JOIN, ORDER BY по индексированным колонкам
  • Каждый INSERT/UPDATE/DELETE обновляет все индексы таблицы
  • Уникальный индекс заодно гарантирует уникальность

А ещё Индекс не используется, если выбирается большая доля строк — полный просмотр дешевле

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Как работает. Без индекса база читает всю таблицу (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 слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем