Ответ
Составной индекс (composite index, multi-column index) — это индекс, созданный по двум или более столбцам таблицы. Он оптимизирует запросы, которые используют эти столбцы в условиях WHERE, ORDER BY или JOIN.
Ключевые особенности:
- Порядок столбцов критически важен. Индекс
(A, B, C)эффективен для запросов с условиями на(A),(A, B)или(A, B, C), но не для запросов только по(B)или(C). - Сокращает количество индексов. Один составной индекс может заменить несколько отдельных индексов для частых комбинаций условий.
- Поддерживает сортировку. Может эффективно использоваться для
ORDER BYпо первому или нескольким первым столбцам индекса.
Пример создания в SQL:
-- Создание составного индекса по столбцам `last_name` и `first_name`
CREATE INDEX idx_name ON employees (last_name, first_name);
Пример эффективного запроса:
-- Этот запрос сможет использовать индекс полностью
SELECT * FROM employees
WHERE last_name = 'Smith' AND first_name = 'John';
-- Этот запрос использует только первую часть индекса (last_name)
SELECT * FROM employees
WHERE last_name = 'Smith'
ORDER BY first_name;
Практическое правило: Столбцы в индексе следует располагать в порядке от наиболее селективного (с наибольшим разнообразием значений) к наименее селективному, а также в соответствии с частыми паттернами запросов.
Ответ 18+ 🔞
Давай разберём эту тему про составные индексы, а то многие думают, что это какая-то хуйня непонятная, а на деле — просто огонь, если правильно приложить.
Представь себе, что индекс — это алфавитный указатель в книге. Обычный индекс — это как искать только по фамилии. А составной — это когда у тебя указатель сразу по фамилии и имени. То есть, открываешь на «Иванов», а там уже внутри по алфавиту все «Александры», «Борисы» и «Владимиры» разложены. Красота, да?
Вот в чём соль, ёпта:
- Порядок столбцов — это пиздец как важно. Если ты создал индекс
(фамилия, имя), то он сработает, когда ты ищешь пофамилииили пофамилии и именивместе. А вот если ты пришёл и такой: «Дай мне всех Васей» — то этот индекс тебе нихуя не поможет. База посмотрит на этот индекс, увидит, что «Вася» — это второй столбец, и пойдёт читать всю таблицу целиком, потому что искать Васю в указателе, отсортированном по фамилиям, — это ебать какой неэффективный пиздец. - Экономия, мать его, места и времени. Вместо того чтобы городить три отдельных индекса на
фамилию, наимяи на(фамилия, имя), можно сделать один умный составной. База будет меньше тратить времени на обслуживание этих индексов при вставке новых данных. - Сортировку за тебя сделает. Нужно выбрать всех Ивановых и отсортировать по имени? Да хуле там, они в индексе уже в таком порядке и лежат! База просто пройдётся по нужной ветке индекса и сразу отдаст данные в правильном порядке. Скорость — овердохуища.
Вот как это в коде выглядит, тут всё просто:
-- Делаем наш крутой указатель по фамилии и имени
CREATE INDEX idx_name ON employees (last_name, first_name);
А вот как этим пользоваться, чтобы не облажаться:
-- Запрос 1: Идеально! Использует весь индекс. База сразу тыкает в нужное место.
SELECT * FROM employees
WHERE last_name = 'Smith' AND first_name = 'John';
-- Запрос 2: Тоже отлично! Использует первую часть индекса (фамилию), а имена внутри уже отсортированы.
SELECT * FROM employees
WHERE last_name = 'Smith'
ORDER BY first_name;
Главное практическое правило, чтобы не вышло как всегда:
Ставь столбцы в таком порядке: сначала тот, по которому чаще всего ищешь, и который имеет больше всего уникальных значений (например, фамилия), а потом уже все остальные (имя, отчество). Думай, как твои запросы обычно выглядят, и подгоняй индекс под них, а не наоборот. Иначе получится мартышлюшка с молотком: вроде инструмент есть, а толку — хуй с горы.