لتحديد المشاكل في طلبات البحث البطيئة وحلّها، استخدِم Query Explain للحصول على خطة تنفيذ طلب البحث وملف تعريف التنفيذ في وقت التشغيل. يوضّح القسم التالي الخطوات التي يمكنك اتّخاذها لتحسين أداء طلب البحث استنادًا إلى ملف التنفيذ:
وضع حدّ لعدد النتائج
استخدِم الحقل "السجلات التي تم عرضها" في شجرة التنفيذ لتحديد ما إذا كان طلب البحث يعرض العديد من المستندات. ننصحك بالحدّ من عدد المستندات التي يتم عرضها باستخدام $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"]}}})، أنشئ فهرسًا على الحقول المعنية في المجموعة الخارجية. يُرجى العِلم أنّه لن يتم استخدام الفهرس المتعدد المفاتيح في التخطيط.
إنشاء الفهارس
اتّبِع مستندات إدارة الفهرس لإنشاء فهارس. لضمان إمكانية استخدام الفهارس في طلب البحث، أنشئ فهارس عادية (وليست فهارس Multikey) تتضمّن حقولاً بالترتيب التالي:
- جميع الحقول التي سيتم استخدامها في عوامل التشغيل الخاصة بالمساواة لزيادة فرص إعادة الاستخدام إلى أقصى حد في جميع طلبات البحث، رتِّب الحقول بترتيب تنازلي حسب عدد مرات ظهور الحقول في عوامل التشغيل المتساوية بين طلبات البحث.
- جميع الحقول التي سيتم ترتيبها (بالترتيب نفسه)
- الحقول التي سيتم استخدامها في عوامل تشغيل النطاق أو عدم المساواة بترتيب تنازلي حسب اختيارية قيود طلب البحث
- الحقول التي سيتم عرضها كجزء من طلب بحث في الفهرس، بما في ذلك تضمين هذه الحقول في الفهرس، يتيح للفهرس تغطية طلب البحث وتجنُّب اضطراره إلى استرداد المستند من وحدة التخزين الأساسية.
بالنسبة إلى طلبات البحث التي تتضمّن فلترة حقول المصفوفات وفرزها، ننصحك بإنشاء فهارس بمفاتيح متعدّدة.
استخدام تلميح طلب البحث
إذا أنشأت فهرسًا أكثر ملاءمةً لطلب البحث ولكن محرّك طلب البحث لا يستخدم هذا الفهرس، يمكنك تجاهل إعدادات محرّك طلب البحث المفضّلة للفهرس باستخدام تلميح طلب بحث.
لمزيد من المعلومات عن ناتج طلب البحث الذي يتم تنفيذه باستخدام "شرح طلب البحث"، راجِع مرجع تنفيذ طلب البحث.