Как изменится эффективность составного индекса в SQL, если поменять порядок его столбцов?

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

Ответ

Эффективность составного индекса кардинально изменится. Порядок столбцов определяет, для каких запросов индекс будет применим. Индекс работает по принципу «слева направо».

Правило: Составной индекс (col1, col2, col3) может быть использован для запросов, фильтрующих по:

  • col1
  • col1, col2
  • col1, col2, col3

Но он НЕ будет эффективно использоваться (или не будет использоваться вовсе) для запросов, которые начинаются с col2 или col3 без col1.

Пример: Для таблицы users с индексом (last_name, first_name).

-- ИСПОЛЬЗУЕТ индекс эффективно (идет по первому столбцу)
SELECT * FROM users WHERE last_name = 'Ivanov';
SELECT * FROM users WHERE last_name = 'Ivanov' AND first_name = 'Petr';

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

Рекомендации по порядку:

  1. Самый селективный столбец (с наибольшим количеством уникальных значений) часто ставят первым.
  2. Столбцы, используемые в условиях WHERE с операторами =, должны идти перед столбцами с диапазонными условиями (>, <, BETWEEN, LIKE).
  3. Столбцы, используемые в ORDER BY, можно добавить в конец индекса для покрывающих запросов (covering index).