Составным называется индекс, который включает в себя сразу несколько полей. Он используется для повышения производительности запросов, которые фильтруют данные по нескольким колонкам одновременно.
==В составных индексах важен порядок столбцов.== Порядок колонок в индексе влияет на его эффективность, и более [[Селективность колонки|селективные]] поля должны идти первыми, чтобы максимизировать производительность. SQL-запросы также должны следовать этому порядку для оптимального использования индекса.
При поиске по составному индексу значения колонок сравниваются по порядку, что делает порядок следования колонок критически важным для эффективности запросов.
> [!WARNING] Количество параметров
> Составной индекс из 2-3 полей обычно считается нормальным и эффективно поддерживаемым. Если количество колонок в индексе превышает три, следует тщательно анализировать его использование, чтобы избежать излишней нагрузки на производительность.
**Преимущества:**
- **Оптимизация дискового пространства**: ==Один составной индекс может заменить несколько простых индексов==, что экономит дисковое пространство.
- **Ускорение запросов**: Составной индекс позволяет ускорять запросы, которые используют несколько колонок для фильтрации и сортировки данных.
**Недостатки:**
- **Высокие накладные расходы при обновлении**: Каждый раз при вставке, обновлении или удалении данных, которые попадают в составной индекс, СУБД должна обновлять весь индекс, что может увеличивать время выполнения таких операций.
- Старайтесь минимизировать использование неравенств в начале составных индексов, так как это может ограничить их применение для последующих колонок.
Создание составного индекса:
```sql
CREATE INDEX idx_example ON table_name (column_a, column_b);
```
Запросы, которые могут использовать этот индекс:
Фильтрация по обоим полям:
```sql
SELECT * FROM orders WHERE customer_id = 123 AND order_date >= '2024-01-01';
```
Этот запрос будет максимально эффективен, так как учитывает оба поля в порядке, указанном в индексе.
Фильтрация только по `customer_id`:
```sql
SELECT * FROM orders WHERE customer_id = 123;
```
Этот запрос также будет использовать индекс, поскольку `customer_id` — первая колонка в составном индексе.
Запрос, который не будет оптимально использовать составной индекс:
```sql
SELECT * FROM orders WHERE order_date >= '2024-01-01';
```
Такой запрос не использует весь потенциал индекса, так как `order_date` не является первой колонкой.
***
## Мета информация
**Область**:: [[../../meta/zero/00 Базы Данных|00 Базы Данных]]