> Что лучше: выбрать из базы одним запросом тысячу id или сделать тысячу запросов по одному id (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: ЦУМ
Стек: Go
> Пример ответа
Однозначно лучше выбрать из базы одним запросом тысячу id. Тысяча отдельных запросов - это классический антипаттерн N+1, который приводит к катастрофической деградации производительности.
Почему один запрос лучше:
- Сетевые задержки: Каждый запрос требует установки соединения (или использования пула), передачи данных по сети и получения ответа. Тысяча запросов - это тысяча round-trip'ов, каждый добавляет минимум 0.5-2 мс задержки, что даёт 0.5-2 секунды только на сеть.
- Нагрузка на БД: База данных тратит ресурсы на парсинг, планирование и выполнение каждого отдельного запроса. Один запрос с
WHERE id IN (...)илиJOINвыполняется как одна транзакция, используя индексы и кеш страниц эффективно. - Транзакционная изоляция: При тысяче запросов сложнее гарантировать консистентность данных (например, если между запросами данные изменятся). Один запрос даёт атомарный срез.
Когда тысяча запросов может быть оправдана (редкие случаи):
- Если каждый id обрабатывается в отдельном микросервисе или внешнем API, и база - лишь часть пайплайна.
- Если список id динамический и формируется на основе результатов предыдущих запросов (но это уже не "просто выборка").
- При работе с очень большими наборами данных (миллионы id), где один запрос может переполнить память или привести к блокировкам - тогда применяют пагинацию или курсоры, но не тысячу отдельных запросов.
В Go это особенно критично: горутины позволяют легко написать конкурентные запросы, но это не решает проблему сетевых задержек и нагрузки на БД. Пример плохого кода:
GOfor _, id := range ids {go func(id int) {row := db.QueryRow("SELECT ... WHERE id = $1", id)// ...}(id)}
Лучше:
GOrows, err := db.Query("SELECT ... WHERE id = ANY($1)", pq.Array(ids))
Вывод: Всегда стремитесь к одному запросу. Тысяча запросов - это ошибка проектирования, которую нужно исправлять на этапе ревью кода.
> Похожие задачи по Go
Как с помощью контекста завершить работу горутины в Go
Как принимаются решения о внедрении изменений
Как послать сигнал в канал, чтобы все горутины получили уведомление о завершении работы в Go
Как работает перебор мапы в цикле в Go и является ли он случайным
> Похожие задачи по backend
Как с помощью контекста завершить работу горутины в Go
Как принимаются решения о внедрении изменений
Как послать сигнал в канал, чтобы все горутины получили уведомление о завершении работы в Go
Как работает перебор мапы в цикле в Go и является ли он случайным
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью