لتحديد المشاكل وحلّها في طلبات البحث البطيئة، استخدِم أداة شرح طلب البحث للحصول على خطة تنفيذ طلب البحث وملف تنفيذ وقت التشغيل. يصف القسم التالي الخطوات التي يمكنك اتّخاذها لتحسين أداء طلب البحث استنادًا إلى ملف التنفيذ:
الحدّ من عدد النتائج
استخدِم حقل "السجلات المعروضة" في شجرة التنفيذ لتحديد ما إذا كان طلب البحث يعرض مستندات كثيرة. يمكنك الحدّ من عدد المستندات المعروضة باستخدام عبارة $limit. يقلّل ذلك من حجم البايت المتسلسل للنتائج عند عرضها للعملاء عبر الشبكة. في الحالات التي يسبق فيها العقدة Limit العقدة MajorSort، يمكن لمحرك طلب البحث دمج العقدتَين Limit وMajorSort واستبدال عملية التجسيد والفرز الكاملتَين في الذاكرة بعملية فرز TopN، ما يقلّل من متطلبات الذاكرة لطلب البحث.
الحدّ من حجم مستند النتائج
يمكنك الحدّ من حجم المستند المعروض باستخدام عبارة $project لتجنُّب جلب الحقول غير الضرورية. يساعد ذلك في تقليل تكلفة الحوسبة والذاكرة لمعالجة النتائج الوسيطة وحجم البايت المتسلسل للنتائج عند عرضها للعملاء عبر الشبكة. في الحالات التي يغطي فيها فهرس عادي (غير فهرس المفاتيح المتعدّدة) جميع الحقول المشار إليها في طلب البحث، يسمح ذلك أيضًا بأن يغطي الفهرس طلب البحث بالكامل، ما يجنّب الحاجة إلى جلب المستندات من وحدة التخزين الأساسية.
استخدام الفهارس
اتّبِع التعليمات التالية لإعداد الفهارس وتحسينها.
تحديد ما إذا كان طلب البحث يستخدم فهرسًا
يمكنك تحديد ما إذا كان طلب البحث يستخدم فهرسًا من خلال التحقّق من العُقد الورقية في شجرة التنفيذ. إذا كانت العقدة الورقية في شجرة التنفيذ هي العقدة TableScan، يعني ذلك أنّ طلب البحث لا يستخدم فهرسًا ويجري فحص المستندات من وحدة التخزين الأساسية. إذا كان يتم استخدام فهرس، ستعرض العقدة الورقية في شجرة التنفيذ رقم تعريف الفهرس وحقول الفهرس.
تحديد ما إذا كان يمكن تحسين الفهرس المستخدَم
يكون الفهرس مفيدًا لطلب البحث إذا كان بإمكانه تقليل عدد المستندات التي يحتاج محرك طلب البحث إلى جلبها من وحدة التخزين الأساسية أو إذا كان ترتيب الحقول فيه يمكن أن يلبّي متطلبات الفرز لطلب البحث.
إذا تم استخدام فهرس لطلب بحث، ولكن كان محرك طلب البحث لا يزال يجلب ويتجاهل مستندات كثيرة، كما هو محدّد من خلال العقدة Scan التي تعرض سجلات كثيرة متبوعة بالعقدة Filter التي تعرض سجلات قليلة، فهذا يشير إلى أنّ دالة طلب البحث التي تم استيفاؤها باستخدام الفهرس ليست انتقائية. لإنشاء فهرس أكثر ملاءمة، اطّلِع على مقالة إنشاء الفهارس.
إذا تم استخدام فهرس غير فهرس المفاتيح المتعدّدة لطلب بحث، ولكن كان محرك طلب البحث لا يزال يجري عملية إعادة ترتيب لمجموعة النتائج في الذاكرة، كما هو محدّد من خلال العقدة MajorSort في شجرة تنفيذ طلب البحث، فهذا يشير إلى أنّه لا يمكن استخدام الفهرس المستخدَم لتلبية متطلبات الفرز لطلب البحث. لإنشاء فهرس أكثر ملاءمة، اطّلِع على القسم التالي.
تحسين طلبات البحث $lookup
يمكنك تحسين طلبات البحث $lookup من خلال إضافة فهارس إلى مجموعة from التي تسمح للعملية بالعثور بكفاءة على المستندات المطابقة بدون فحص المجموعة بأكملها.
$lookup مع localField وforeignField
إذا كنت تستخدم الخيارَين localField وforeignField في مرحلة $lookup، أنشِئ فهرسًا على foreignField في مجموعة from.
$lookup مع عمليات نقل البيانات المضمّنة
إذا كنت تستخدم الخيار pipeline في مرحلة $lookup مع مراحل $match، أنشِئ فهرسًا على الحقول المتضمّنة في المجموعة الخارجية لتجنُّب فحص المجموعة بالكامل:
- بالنسبة إلى مراحل
$matchالتي تتضمّن دلالات الفلتر (مثل{$match: {a: true}})، أنشِئ فهرسًا على الحقول المتضمّنة في المجموعة الخارجية (a). - بالنسبة إلى مراحل
$matchالتي تتضمّن دلالات التجميع التي تقارن حقلًا بقيمة ثابتة (مثل{$match: {$expr: {$gt: [a, 10]}}}) أو مع مقارنات التساوي (eqأوin) بين الحقول والمتغيّرات المحدّدة فيlet(مثل{$match: {$expr: {$eq: [a, "$$a"]}}})، أنشِئ فهرسًا على الحقول المتضمّنة في المجموعة الخارجية. يُرجى العِلم أنّه لن يتم استخدام فهرس المفاتيح المتعدّدة في التخطيط.
إنشاء الفهارس
اتّبِع مستندات إدارة الفهارس لـ إنشاء الفهارس. لضمان إمكانية استخدام طلب البحث للفهارس، أنشِئ فهارس عادية (غير فهارس المفاتيح المتعدّدة) تتضمّن حقولًا بالترتيب التالي:
- جميع الحقول التي سيتم استخدامها في عوامل تشغيل التساوي. لتحقيق أقصى قدر من فرص إعادة الاستخدام على مستوى طلبات البحث، رتِّب الحقول بترتيب تنازلي حسب عدد مرات ظهور الحقول في عوامل تشغيل التساوي بين طلبات البحث.
- جميع الحقول التي سيتم فرزها (بالترتيب نفسه).
- الحقول التي سيتم استخدامها في عوامل تشغيل النطاق أو عدم التساوي بترتيب تنازلي حسب مدى انتقائية قيود طلب البحث.
- الحقول التي سيتم عرضها كجزء من طلب بحث في الفهرس: يسمح تضمين هذه الحقول في الفهرس بأن يغطي الفهرس طلب البحث ويتجنّب الحاجة إلى جلب المستند من وحدة التخزين الأساسية.
بالنسبة إلى طلبات البحث التي تتضمّن فلترة حقول الصفيف وفرزها، ننصحك بإنشاء فهارس المفاتيح المتعدّدة.
استخدام تلميح طلب البحث
إذا أنشأت فهرسًا أكثر ملاءمة لطلب البحث ولكن محرك طلب البحث لا يستخدم هذا الفهرس، يمكنك إلغاء إعدادات الفهرس المفضّلة لمحرك طلب البحث باستخدام تلميح طلب البحث.
لمزيد من المعلومات عن ناتج طلب البحث الذي يتم تنفيذه باستخدام أداة "شرح طلب البحث"، اطّلِع على مرجع تنفيذ طلب البحث.