--- 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]] ### Дополнительные материалы - ### Дочерние заметки - [[Составной индекс в PostgreSQL]]