В каком порядке нужно перечислять поля при создании составного индекса?

«В каком порядке нужно перечислять поля при создании составного индекса?» — вопрос из категории SQL и базы данных, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Поля в составном индексе следует перечислять в порядке убывания селективности (от наиболее уникальных к наименее уникальным) и с учетом типичных запросов.

Почему?

  • Селективность: Наиболее селективное поле (например, user_id) быстро отфильтровывает большую часть данных, уменьшая объем для последующей фильтрации.
  • Порядок в WHERE: Индекс эффективно используется, если запрос фильтрует по префиксу индекса. Индекс (A, B, C) подходит для WHERE A=1 AND B=2, но не для WHERE B=2.

Пример (PostgreSQL):

-- Плохо: status имеет низкую селективность (всего 3-4 значения)
CREATE INDEX idx_bad ON orders (status, user_id, created_at);

-- Хорошо: user_id высокоселективен, часто используется в фильтрах
CREATE INDEX idx_good ON orders (user_id, status, created_at);

-- Запрос, который эффективно использует idx_good:
SELECT * FROM orders
WHERE user_id = 12345 AND status = 'shipped'
ORDER BY created_at DESC;
-- Индекс обеспечит быструю фильтрацию по user_id, затем по status и сортировку по created_at.

Дополнительно: Также важно учитывать поля, используемые в ORDER BY или JOIN. Индекс может покрывать запрос (covering index), если включает все выбираемые поля.