Ответ
Да, в большинстве реляционных баз данных можно создавать составные (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), так как базе данных нужно обновлять и индексную структуру.