72 lines
5.2 KiB
Markdown
72 lines
5.2 KiB
Markdown
---
|
||
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 -->
|
||
|