تحسين أداء طلبات البحث

لتحديد المشاكل في طلبات البحث البطيئة وحلّها، استخدِم 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) تتضمّن حقولاً بالترتيب التالي:

  1. جميع الحقول التي سيتم استخدامها في عوامل التشغيل الخاصة بالمساواة لزيادة فرص إعادة الاستخدام إلى أقصى حدّ في جميع طلبات البحث، رتِّب الحقول بترتيب تنازلي حسب عدد مرات ظهورها في عوامل المساواة بين طلبات البحث.
  2. جميع الحقول التي سيتم ترتيبها حسبها (بالترتيب نفسه).
  3. الحقول التي سيتم استخدامها في عوامل تشغيل النطاق أو عدم المساواة بترتيب تنازلي حسب اختيارية قيود طلب البحث
  4. الحقول التي سيتم عرضها كنتيجة لطلب بحث في الفهرس: يتيح تضمين هذه الحقول في الفهرس أن يغطي الفهرس طلب البحث، ما يجنّب الحاجة إلى استرداد المستند من مساحة التخزين الأساسية.

بالنسبة إلى طلبات البحث التي تتضمّن فلترة حقول المصفوفات وفرزها، ننصحك بإنشاء فهارس ذات مفاتيح متعدّدة.

استخدام تلميح طلب البحث

إذا أنشأت فهرسًا أكثر ملاءمة لطلب البحث ولكن محرّك طلب البحث لا يستخدم هذا الفهرس، يمكنك تجاهل إعدادات محرّك طلب البحث المفضّلة للفهرس باستخدام تلميح طلب البحث.

لمزيد من المعلومات عن ناتج طلب البحث الذي يتم تنفيذه باستخدام "شرح طلب البحث"، راجِع مرجع تنفيذ طلب البحث.