Будет ли использоваться составной индекс, если запрос фильтрует только по второму полю индекса?

«Будет ли использоваться составной индекс, если запрос фильтрует только по второму полю индекса?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Как правило, нет. Составной (композитный) индекс эффективен при запросах, которые используют его поля с левой стороны (leftmost prefix rule).

Правило префикса: Индекс по полям (A, B, C) может быть использован для запросов с условиями на:

  • A
  • A, B
  • A, B, C

Запрос только по полю B или C не сможет эффективно использовать этот индекс для поиска (хотя в некоторых СУБД, например MySQL с InnoDB, может использоваться для index-only scan, если все нужные поля есть в индексе, но это все равно неэффективный полный scan индекса).

Пример (MySQL/PostgreSQL):

-- Создан индекс: CREATE INDEX idx_compound ON users(last_name, first_name, age);

-- ИСПОЛЬЗУЕТ индекс (левое поле last_name):
SELECT * FROM users WHERE last_name = 'Ivanov';

-- НЕ ИСПОЛЬЗУЕТ индекс эффективно для поиска (пропущено last_name):
SELECT * FROM users WHERE first_name = 'Petr'; -- Полный scan индекса или таблицы

Решение: Для запросов, фильтрующих только по first_name, нужно создать отдельный индекс на это поле.