Что быстрее отработает: один большой или множество маленьких запросов к базе данных?

«Что быстрее отработает: один большой или множество маленьких запросов к базе данных?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В большинстве случаев один большой запрос выполняется быстрее множества маленьких. Основная причина — сокращение сетевых издержек и накладных расходов СУБД.

Преимущества одного запроса:

  • Снижение сетевого латентности: Каждый запрос требует передачи данных туда и обратно между приложением и БД.
  • Меньше накладных расходов СУБД: Парсинг, оптимизация и выполнение плана запроса происходят один раз.
  • Решение проблемы 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);

Когда множество маленьких запросов может быть оправдано:

  1. Пагинация: Загрузка данных постранично, чтобы не выгружать гигабайты за раз.
  2. Ленивая загрузка (Lazy Loading): Данные подгружаются только когда они действительно нужны.
  3. Сложные агрегации по большим таблицам: Один тяжелый аналитический запрос может блокировать ресурсы, тогда лучше разбить его на части.