فرض کنید ۱۰۰ سفارش را می‌خوانید و برای نمایش نام مشتری هر سفارش، یک کوئری جدا می‌زنید. نتیجه: ۱ + ۱۰۰ کوئری. این مشکل N+1 است و با رشد داده، سرعت را خراب می‌کند.

// بد: N+1
const orders = await Order.findAll();
for (const o of orders) {
  o.customer = await Customer.findByPk(o.customerId);
}

// بهتر: یک کوئری با include/JOIN
const orders = await Order.findAll({ include: Customer });

راه‌حل‌ها

  • بارگذاری رابطه با JOIN یا eager loading در ORM.
  • یک کوئری جداگانه با WHERE id IN (...) برای همهٔ رابطه‌ها.
  • استفاده از DataLoader در GraphQL.

برای کشف آن، لاگ کوئری‌ها را فعال کنید یا تعداد کوئری هر درخواست را در محیط توسعه بشمارید.