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

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

Компании: Ozon

Стек: Go

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

Для запроса с условиями на несколько столбцов в Go (и в SQL в целом) оптимальным решением будет композитный (составной) индекс. Он создаётся на все столбцы, участвующие в условиях WHERE, в определённом порядке.

Правило выбора порядка столбцов:

  1. Сначала столбцы с условиями равенства (=) - они обеспечивают максимальную селективность.
  2. Затем столбцы с условиями диапазона (>, <, BETWEEN, LIKE без ведущего wildcard).
  3. В конце - столбцы для сортировки (ORDER BY).

Пример для Go-приложения (PostgreSQL): Допустим, есть таблица orders и частый запрос:

SQL
SELECT * FROM orders WHERE user_id = 123 AND status = 'active' AND created_at > '2024-01-01';

Индекс:

SQL
CREATE INDEX idx_orders_user_status_date ON orders (user_id, status, created_at);

Здесь user_id и status - равенство, created_at - диапазон.

Важно:

  • Если в запросе есть OR, композитный индекс может не использоваться - тогда рассмотрите отдельные индексы или UNION.
  • Для Go-приложений с ORM (например, GORM) убедитесь, что индексы явно объявлены через миграции, а не полагайтесь на авто-создание.
  • Используйте EXPLAIN ANALYZE для проверки плана выполнения.

Альтернатива: Если столбцы часто меняются в условиях, можно построить несколько отдельных индексов - СУБД может комбинировать их через Bitmap Scan (в PostgreSQL), но это менее эффективно, чем один композитный.

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

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