Ответ
В большинстве случаев один большой запрос выполняется быстрее множества маленьких. Основная причина — сокращение сетевых издержек и накладных расходов СУБД.
Преимущества одного запроса:
- Снижение сетевого латентности: Каждый запрос требует передачи данных туда и обратно между приложением и БД.
- Меньше накладных расходов СУБД: Парсинг, оптимизация и выполнение плана запроса происходят один раз.
- Решение проблемы N+1: Классическая антипаттерн, когда для получения связанных данных выполняется множество дополнительных запросов.
Пример (PHP с PDO):
// Медленно: N+1 запросов
$userIds = [1, 2, 3, 4, 5];
$users = [];
foreach ($userIds as $id) {
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$id]);
$users[] = $stmt->fetch(PDO::FETCH_ASSOC);
}
// Быстро: один запрос с IN
$placeholders = str_repeat('?,', count($userIds) - 1) . '?';
$stmt = $pdo->prepare("SELECT * FROM users WHERE id IN ($placeholders)");
$stmt->execute($userIds);
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
Когда множество маленьких запросов может быть оправдано:
- Пагинация: Загрузка данных постранично, чтобы не выгружать гигабайты за раз.
- Ленивая загрузка (Lazy Loading): Данные подгружаются только когда они действительно нужны.
- Сложные агрегации по большим таблицам: Один тяжелый аналитический запрос может блокировать ресурсы, тогда лучше разбить его на части.