> Почему запрос с индексами может тормозить и как это решать (Go)

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

Компании: sferaplatform.ru

Стек: Go

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

Даже при наличии индексов запрос может тормозить по нескольким причинам. Основные из них:

  1. Неоптимальный план запроса - оптимизатор БД может выбрать неправильный индекс из-за устаревшей статистики. Решение: выполнить ANALYZE для обновления статистики и проверить план через EXPLAIN ANALYZE.

  2. Index Scan вместо Index Only Scan - если запрос выбирает столбцы, не входящие в индекс, БД вынуждена обращаться к таблице (Heap Lookup). Решение: создать покрывающий индекс (covering index), включив все нужные поля в INCLUDE.

  3. Низкая селективность индекса - индекс на столбце с множеством дубликатов (например, status с 2 значениями) неэффективен. Решение: пересмотреть композитный индекс или использовать частичные индексы (WHERE status = 'active').

  4. Сортировка и группировка - если индекс не покрывает ORDER BY или GROUP BY, БД выполняет дополнительную сортировку. Решение: добавить столбцы сортировки в индекс в правильном порядке.

  5. Bloat индекса - после массовых обновлений/удалений индекс становится фрагментированным. Решение: перестроить индекс (REINDEX в PostgreSQL, ALTER INDEX ... REBUILD в SQL Server).

  6. Неверный порядок столбцов в композитном индексе - если условие WHERE не начинается с первого столбца индекса, индекс может не использоваться. Решение: размещать столбцы с высокой селективностью первыми.

В Go-приложении полезно логировать медленные запросы (через database/sql с таймаутами) и анализировать их через EXPLAIN ANALYZE. Также стоит избегать N+1 запросов в ORM-подобных паттернах - используйте JOIN или batch-загрузку.

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

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