digital-garden/dev/database/Составной индекс в БД.md

72 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
aliases:
- Составные индексы
- многоколоночный индекс
tags:
- maturity/🌱
date: 2024-06-16
---
Составной индекс — это индекс, включающий несколько полей, который используется для повышения производительности запросов, фильтрующих данные сразу по нескольким колонкам.
Проще всего представить составной индекс не как последовательность индексов по отдельным колонкам, а как индекс по объединённым значениям этих колонок. Поэтому порядок столбцов в составном индексе имеет значение.== Он влияет на эффективность индекса, и поэтому чаще всего ==наиболее [[Селективность колонки|селективные]] поля следует располагать первыми== для максимальной производительности. ==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 Реляционная база данных]]
**Родитель**:: [[Индекс базы данных]]
**Источник**::
**Автор**::
**Создана**:: [[2024-06-16]]
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
- [[Составной индекс в PostgreSQL]]
<!-- SerializedQuery END -->