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