انتقل إلى محتوى الدرس

Lazy Loading and Query Bottlenecks التحميل الكسول ومشكلة استعلامات N1

تشخيص مشكلة الأداء N+1 Query الناتجة عن التحميل الكسول وحلها جذرياً عبر التحميل المسبق بالدالة with ومنع التحميل الكسول.
1 صفوف تعليمية
إطار العمل Laravel
0 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

تعتمد علاقات Eloquent افتراضياً على التحميل الكسول، أي أن السجلات المرتبطة لا يتم جلبها من قاعدة البيانات إلا لحظة قراءة خاصية العلاقة فعلياً في الكود. عند الدوران على 50 مقالاً وقراءة اسم المؤلف داخل الحلقة، ينفذ الإطار استعلاماً واحداً للمقالات متبوعاً بـ 50 استعلاماً منفصلاً لكل مؤلف، مما يسبب اختناق الأداء المعروف بمشكلة N+1.

  • الجلب عند الطلب (Lazy Loading): لا يتم تنفيذ استعلام العلاقة إلا عند قراءة الخاصية الديناميكية لأول مرة.
  • مضاعف الاستعلامات (N+1 Queries): استعلام واحد للآباء يتبعه N استعلام داخل الحلقة لكل سجل فرعي على حدة.
  • البطء الخفي في الإنتاج (Production Bottleneck): لا يظهر أثره مع 3 سجلات محلياً لكنه يبطئ الخادم بشدة عند نمو البيانات.
مخطط معماري يوضح التحميل المسبق وحل مشكلة استعلامات N Plus 1 في Eloquent في إطار العمل Laravel 12
PHP
// Bad: Triggers 1 + N queries!
$posts = Post::all();

foreach ($posts as $post) {
    $author = $post->user->name;
}