N+1 Problem في SQL: الحل الأمثل بالأمثلة 2026

x32x01
  • بواسطة x32x01 ||
مشكلة N+1 في SQL: لما تجيب كل حاجة لوحدها 📝
البوست اللي فات اتكلمنا عن الصينية المليانة أكل وانت طلبت ساندوتش واحد 🍔

هنتخيل إن ربنا كرمك واشتريت الكافيه وبقيت المدير 😎
  • دخلت تعمل جرد للطلبات اليومية
  • طلبت من الويتر قايمة الطلبات وكل طلب فيه إيه
  • الويتر رجع جابلك كل الطلبات لوحدها
  • بعدين مشي وجابلك الأصناف لوحدها
أنت دلوقتي محتاج تعرف طلب رقم 5 فيه إيه، ومش عايز تتعب وتوصل بين القايمتين يدويًا 😅



نفس القصة بتحصل جوه الـ Database 💻

لو كتبنا الكويري بالشكل ده:
SQL:
-- نجيب الطلبات
SELECT * FROM orders;

-- بعدين لكل طلب نجيب الأصناف
SELECT * FROM items WHERE order_id = 1;
SELECT * FROM items WHERE order_id = 2;
SELECT * FROM items WHERE order_id = 3;
  • لو عندك 100 طلب → هتعمل 101 Query 😱
  • كأنك بتبص في ورقتين وتحاول تفهم كل صنف تابع لأي طلب



ليه دي تعتبر من مشاكل N+1 ⚠️

  • بتتعامل مع الداتا بطريقة ساذجة:
    1. تجيب الطلبات لوحدها
    2. بعدين ترجع تجيب الأصناف لوحدها
    3. تدخل نفسك في Queries زيادة من غير لازمة
  • النتيجة: بطء في الأداء، استهلاك أكبر للـ Server، وزيادة التحميل على الشبكة

الحل: استخدم INNER JOIN 🛠️

بدل ما تجيب كل حاجة لوحدها، نقدر نستخدم INNER JOIN ونربط الطلبات بالأصناف في نفس الاستعلام:
SQL:
SELECT o.id   AS order_id,
       o.total,
       i.name AS item_name
FROM orders o
INNER JOIN items i
        ON o.id = i.order_id;
  • كده جبت كل الطلبات مع الأصناف بتاعتها في ورقة واحدة ✅
  • مثال النتيجة:
    • طلب رقم 1 = برجر 🍔
    • طلب رقم 2 = قهوة ☕
    • طلب رقم 3 = بيتزا 🍕



فايدة INNER JOIN 🎯

  • بيجيبلك بس الطلبات اللي ليها أصناف مرتبطة بيها
  • بتقلل عدد الـ queries وتخلي الأداء أسرع
  • مناسب جدًا لأي database كبيرة أو application فيه علاقات بين الجداول



المرة الجاية: لو فيه طلبات ملهاش أصناف؟ 🤔

  • هل نعرضها؟ ولا نرميها؟
  • هنا هنحتاج نوع تاني من الـ JOIN زي LEFT JOIN
  • ده هيسمحلك تشوف كل الطلبات حتى لو ملهاش أصناف مرتبطة

مصادر للتعلم العميق 📚

لو حابب تتعلم أكتر عن تحسين أداء الـ Database ومشاكل زي دي، شوف كتاب:
High Performance MySQL
  • تأليف: Baron Schwartz, Peter Zaitsev, Vadim Tkachenko
هتستمتع جدًا وانت بتتعلم إزاي تحسن الأداء وتتجنب المشاكل قبل ما تحصل 🚀
 
المواضيع ذات الصلة
x32x01
الردود
0
المشاهدات
618
x32x01
x32x01
x32x01
الردود
0
المشاهدات
672
x32x01
x32x01
x32x01
الردود
0
المشاهدات
610
x32x01
x32x01
x32x01
الردود
0
المشاهدات
1K
x32x01
x32x01
x32x01
الردود
0
المشاهدات
123
x32x01
x32x01
x32x01
الردود
0
المشاهدات
41
x32x01
x32x01
الدخول أو التسجيل السريع
نسيت كلمة مرورك؟
إحصائيات المنتدى
المواضيع
1,938
المشاركات
2,138
أعضاء أكتب كود
478
أخر عضو
anashanashanash
عودة
أعلى