Sobes.tech
Назад к вопросам
Junior — Middle
61

Можно ли создать индекс, который будет учитывать сразу два поля в базе данных?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Да, можно создать составной индекс, который включает несколько полей сразу. Такой индекс ускоряет запросы, где в WHERE, JOIN или ORDER BY используются эти поля вместе. Важно понимать порядок колонок: он влияет на то, какие запросы смогут эффективно использовать индекс.

Определение:

Составной индекс — это индекс по двум и более колонкам таблицы. Он хранит данные в порядке, зависящем от последовательности полей в индексе, поэтому особенно полезен для фильтрации и сортировки по нескольким условиям одновременно. При этом порядок колонок в индексе имеет значение: чаще всего эффективнее использовать сначала более селективное или чаще фильтруемое поле.

Пример использования:

Например, в таблице заказов часто ищут заказы конкретного клиента за определённый период. Тогда имеет смысл создать индекс по CustomerId и CreatedAt.

CREATE INDEX IX_Orders_CustomerId_CreatedAt
ON Orders (CustomerId, CreatedAt);

Такой индекс поможет запросу вида:

SELECT *
FROM Orders
WHERE CustomerId = 10
  AND CreatedAt >= '2025-01-01'
ORDER BY CreatedAt;

Пояснение кода:

Код выше создаёт индекс сразу по двум колонкам: сначала по CustomerId, затем по CreatedAt.
Когда выполняется запрос, база сможет быстрее найти все записи нужного клиента и затем эффективно отфильтровать их по дате.
Если бы условия использовали только CreatedAt без CustomerId, такой индекс мог бы помочь хуже, потому что используется не ведущая колонка индекса.

Ключевые моменты:

  • Да, индекс может включать сразу несколько полей — это называется составной индекс.
  • Порядок полей в индексе критичен и влияет на производительность запросов.
  • Такой индекс особенно полезен для запросов с несколькими условиями и сортировкой.
  • Индекс не ускоряет все запросы одинаково: чаще всего он работает лучше, если используются первые колонки индекса.
  • Создание лишних индексов увеличивает стоимость INSERT, UPDATE и DELETE.