Что такое составной индекс в базах данных и как его создать?

Ответ

Да, в большинстве реляционных баз данных можно создавать составные (composite) индексы, которые включают в себя несколько колонок. Это позволяет значительно ускорить выполнение запросов, фильтрующих данные сразу по нескольким полям.

Зачем это нужно? Составной индекс эффективен для запросов вида WHERE column1 = 'value1' AND column2 = 'value2'. Без него базе данных пришлось бы сначала фильтровать по одному индексу, а затем сканировать полученные результаты по второму условию.

Пример на чистом SQL:

CREATE INDEX idx_name_email ON users (name, email);

Пример в Go с использованием GORM: В GORM составные индексы удобно определять с помощью тегов структуры. Важно дать одинаковое имя индексу в тегах у всех полей, которые должны в него войти.

type User struct {
    ID    uint
    Name  string `gorm:"index:idx_name_email"`
    Email string `gorm:"index:idx_name_email"`
    Age   int
}

Ключевые моменты:

  • Порядок полей в индексе критически важен. Запрос WHERE Name = ? сможет использовать индекс (Name, Email), а запрос WHERE Email = ? — как правило, нет. Запрос должен использовать поля в том порядке, в котором они определены в индексе (левый префикс).
  • Компромисс производительности. Составные индексы ускоряют чтение (SELECT), но могут незначительно замедлять операции записи (INSERT, UPDATE), так как базе данных нужно обновлять и индексную структуру.