Что такое составные (композитные) индексы и в каких случаях вы их использовали?

Ответ

Составной (или композитный) индекс — это индекс в базе данных, который строится по значениям из нескольких колонок одной таблицы. Он используется для ускорения выполнения запросов, которые фильтруют, сортируют или группируют данные сразу по нескольким полям.

Основная польза: Значительно повышается производительность запросов, использующих все или первые несколько полей индекса в условии 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{})

Ключевые моменты, которые нужно учитывать:

  1. Порядок колонок: Индекс (company_id, status) будет эффективен для запросов по company_id и для запросов по (company_id, status). Однако он будет бесполезен для запроса, который фильтрует только по status.
  2. Покрывающие индексы (Covering Indexes): Если все поля, запрашиваемые в SELECT, содержатся в индексе, база данных может вернуть результат, даже не обращаясь к самой таблице. Это самый быстрый способ выполнения запроса.
  3. Издержки: Составные индексы, как и любые другие, замедляют операции записи (INSERT, UPDATE, DELETE), так как базе данных требуется обновлять не только таблицу, но и структуру индекса.