Как правильно создать индексы для двух запросов: по двум полям и по идентификатору?

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

Ответ

Для оптимальной производительности рекомендуется создать два отдельных индекса: составной индекс для поиска по двум полям и отдельный индекс для идентификатора.

Рекомендуемая схема индексов:

  1. Составной (композитный) индекс для полей field1 и field2:

    CREATE INDEX idx_field1_field2 ON your_table (field1, field2);
    • Этот индекс эффективен для запросов с условиями на field1 или на field1 и field2 вместе.
    • Он неэффективен для поиска только по field2 (из-за порядка столбцов в индексе).
  2. Отдельный индекс на столбец id (если это не первичный ключ, который уже индексируется автоматически):

    CREATE INDEX idx_id ON your_table (id);
    • Обеспечивает максимальную скорость для точечных запросов (WHERE id = ?) и операций JOIN.

Почему не один индекс? Составной индекс (id, field1, field2) может покрыть оба запроса, но он будет избыточным по размеру и менее эффективным для поиска только по field1 и field2, если id не является частью условия. Два специализированных индекса — более гибкое и часто оптимальное решение.