> Какой индекс предложить для запроса с условиями по курсу студента и полу и почему (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

Для запроса с условиями по курсу студента и полу оптимальным будет составной индекс (composite index) на поля (course, gender).

Почему именно такой порядок полей?

  1. Селективность (избирательность): Курс студента обычно имеет меньше уникальных значений (например, 1-6), чем пол (2 значения). Размещение более селективного поля (course) первым позволяет базе данных максимально сузить набор строк на первом же шаге сканирования индекса. Если начать с gender, то после фильтрации по полу останется ~50% записей, которые затем придётся дополнительно фильтровать по курсу - это менее эффективно.

  2. Покрытие запроса: Если запрос содержит только эти два условия (например, WHERE course = 3 AND gender = 'male'), индекс будет полностью покрывающим - все необходимые данные находятся в самом индексе, и не потребуется обращаться к таблице (index-only scan). Это значительно ускоряет выполнение.

  3. Сортировка: Если в запросе есть ORDER BY course, индекс уже отсортирован по этому полю, что позволяет избежать дополнительной сортировки.

Пример в Go (с использованием GORM или raw SQL):

GO
// GORM
type Student struct {
gorm.Model
Course int `gorm:"index:idx_course_gender"`
Gender string `gorm:"index:idx_course_gender"`
}
// Raw SQL
// CREATE INDEX idx_course_gender ON students (course, gender);

Альтернативный вариант: Если запросы часто фильтруют только по полу, можно добавить отдельный индекс на gender, но для комбинированного условия составной индекс всегда эффективнее двух отдельных.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью