Ответ
Составной (или композитный) индекс — это индекс в базе данных, который строится по значениям из нескольких колонок одной таблицы. Он используется для ускорения выполнения запросов, которые фильтруют, сортируют или группируют данные сразу по нескольким полям.
Основная польза:
Значительно повышается производительность запросов, использующих все или первые несколько полей индекса в условии WHERE
или ORDER BY
. Порядок колонок в индексе имеет решающее значение.
Пример использования:
Представим, что у нас часто выполняется запрос для поиска пользователей по company_id
и status
:
SELECT * FROM users WHERE company_id = ? AND status = ?;
Без составного индекса базе данных пришлось бы сначала отфильтровать по одному полю, а затем из полученного результата фильтровать по второму. С составным индексом поиск происходит гораздо эффективнее.
Создание индекса:
-
Чистый SQL:
CREATE INDEX idx_users_company_status ON users (company_id, status);
-
В Go с использованием GORM:
type User struct { gorm.Model CompanyID uint `gorm:"index:idx_company_status"` Status string `gorm:"index:idx_company_status"` Name string } // Или через автомиграцию: db.AutoMigrate(&User{})
Ключевые моменты, которые нужно учитывать:
- Порядок колонок: Индекс
(company_id, status)
будет эффективен для запросов поcompany_id
и для запросов по(company_id, status)
. Однако он будет бесполезен для запроса, который фильтрует только поstatus
. - Покрывающие индексы (Covering Indexes): Если все поля, запрашиваемые в
SELECT
, содержатся в индексе, база данных может вернуть результат, даже не обращаясь к самой таблице. Это самый быстрый способ выполнения запроса. - Издержки: Составные индексы, как и любые другие, замедляют операции записи (
INSERT
,UPDATE
,DELETE
), так как базе данных требуется обновлять не только таблицу, но и структуру индекса.