digital-garden/dev/database/Составные индексы в БД.md
Struchkov Mark 8749f8afcd
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone Build is passing
Индекс базы данных.md
2024-10-25 21:35:39 +03:00

69 lines
4.9 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 -->