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

لتحديد المشاكل وحلّها في طلبات البحث البطيئة، استخدِم Query Explain للحصول على خطة تنفيذ طلب البحث وملف تعريف التنفيذ في وقت التشغيل. يوضّح القسم التالي الخطوات التي يمكنك اتّخاذها لتحسين أداء طلبات البحث استنادًا إلى ملف التنفيذ:

تحديد عدد النتائج

استخدِم حقل السجلات المعروضة في شجرة التنفيذ لتحديد ما إذا كان طلب البحث يعرض العديد من المستندات. يمكنك الحد من عدد المستندات التي يتم عرضها باستخدام مرحلة limit(...). يؤدي ذلك إلى تقليل حجم البايت المتسلسل للنتائج عند إرجاعها إلى العملاء عبر الشبكة. في الحالات التي تسبق فيها العقدة Limit العقدة MajorSort، يمكن لمحرّك طلبات البحث دمج العقدتَين Limit وMajorSort واستبدال عملية التجسيد والترتيب الكاملة في الذاكرة بترتيب TopN، ما يقلّل من متطلبات الذاكرة لطلب البحث.

الحدّ من حجم مستند النتيجة

ننصحك بالحدّ من حجم المستند الذي يتم عرضه باستخدام select(...) لعرض الحقول المطلوبة فقط أو remove_fields(...) لتجاهل الحقول الكبيرة جدًا. يساعد ذلك في تقليل تكلفة الحوسبة والذاكرة لمعالجة النتائج الوسيطة وحجم البايت المتسلسل للنتائج عند إرجاعها إلى العملاء عبر الشبكة. في الحالات التي تكون فيها جميع الحقول المُشار إليها في طلب البحث مشمولة بفهرس عادي، يسمح هذا أيضًا بأن يكون طلب البحث مشمولاً بالكامل بفحص الفهرس، ما يجنّب الحاجة إلى جلب المستندات من مساحة التخزين الأساسية.

استخدام الفهارس

اتّبِع التعليمات التالية لإعداد الفهارس وتحسينها.

تحديد ما إذا كان طلب البحث يستخدم فهرسًا

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

تحديد فهرس أفضل

يكون الفهرس مفيدًا لطلب البحث إذا كان بإمكانه تقليل عدد المستندات التي يحتاج محرّك طلبات البحث إلى جلبها من مساحة التخزين الأساسية أو إذا كان ترتيب الحقول فيه يمكن أن يلبّي متطلبات الترتيب لطلب البحث.

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

إذا تم استخدام فهرس لطلب بحث، ولكن محرّك طلبات البحث لا يزال يعيد ترتيب مجموعة النتائج في الذاكرة، كما هو محدّد بواسطة عقدة MajorSort في شجرة تنفيذ طلب البحث، فهذه علامة على أنّ الفهرس المستخدَم لا يمكن استخدامه لتلبية متطلبات الفرز لطلب البحث. لإنشاء فهرس أكثر ملاءمة، راجِع القسم التالي.

إنشاء الفهارس

اتّبِع مستندات إدارة الفهارس من أجل إنشاء الفهارس. لضمان إمكانية استخدام طلب البحث للفهارس، أنشئ فهارس عادية (ليست متعددة المفاتيح) مع الحقول بالترتيب التالي:

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

فرض فحص الفهرس أو الجدول

عند طلب البحث في Cloud Firestore، يتم تلقائيًا استخدام أي فهارس من المحتمل أن تجعل طلب البحث أكثر كفاءة. وبالتالي، لا تحتاج إلى تحديد فهرس لطلبات البحث. ومع ذلك، بالنسبة إلى طلبات البحث المهمة لأعباء العمل، ننصحك باستخدام الخيار forceIndex للحصول على أداء أكثر اتساقًا.

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

يمكنك استخدام الخيار forceIndex في أي مرحلة إدخال في عمليات Pipeline لتجاوز خطة طلب البحث التلقائية في Cloud Firestore وتحديد فهرس لاستخدامه أو فرض فحص الجدول.

فرض فهرس معيّن

لفرض استخدام فهرس معيّن في طلب البحث، أدخِل معرّف الفهرس كسلسلة في الخيار forceIndex. يمكنك العثور على معرّف الفهرس من وحدة التحكّم أو من رسائل الخطأ.

يفرض المثال التالي على المخطِّط استخدام الفهرس الذي يحمل المعرّف CICAgOi36pgK:

Node.js
// Force Planner to use Index ID CICAgOi36pgK
await db.pipeline()
  .collectionGroup({ collectionId: "customers", forceIndex: "CICAgOi36pgK" })
  .limit(100)
  .execute();
Java
// Force Planner to use Index ID CICAgOi36pgK
Pipeline.Snapshot results1 =
    firestore.pipeline()
      .collectionGroup("customers", new CollectionGroupOptions()
          .withHints(new CollectionHints().withForceIndex("CICAgOi36pgK")))
      .limit(100)
      .execute().get();
متابعة
// Force Planner to use Index ID CICAgOi36pgK
snapshot1 := client.Pipeline().
	CollectionGroup("customers", firestore.WithForceIndex("CICAgOi36pgK")).
	Limit(100).
	Execute(ctx)

في ما يلي بعض حالات الاستخدام لفرض فهرس معيّن:

  • اختبار أداء الفهارس المختلفة.
  • ضمان استخدام فهرس محدّد ومعروف بأنّه مثالي لطلب بحث معيّن
  • تجاوز المحسِّن عندما يكون خياره التلقائي دون المستوى الأمثل لطلب بحث معيّن.

إذا لم يتم العثور على الفهرس المحدّد، سيتعذّر تنفيذ طلب البحث.

فرض فحص الجدول

يقرأ فحص الجدول المستندات في المجموعة أو مجموعة المجموعات بدون استخدام أي فهارس ثانوية. لفرض فحص الجدول، اضبط forceIndex على primary.

يفرض المثال التالي فحص الجدول:

// Force Planner to only do a Full-Table Scan
db.pipeline()
  .collectionGroup({ collectionId: "customers", forceIndex: "primary" })
  .limit(100)

يمكنك استخدام فحص الجدول في الحالات التالية:

  • للمجموعات الصغيرة جدًا التي لا تبرر تكلفة الفهرسة.
  • لطلبات البحث التي تصل إلى معظم المستندات في مجموعة.
  • لتصحيح الأخطاء ومقارنة الأداء

استخدام forceIndex مع ميزة "تفسير طلب البحث"

يمكنك استخدام ميزة تفسير طلب البحث في الوضعَين explain أو analyze لملاحظة تأثيرات forceIndex:

  • يُرجى التأكّد من أنّ Cloud Firestore استخدم الفهرس المحدّد في forceIndex من خلال التحقّق من العُقد الطرفية لشجرة التنفيذ بحثًا عن معرّف الفهرس.
  • تأكَّد من ظهور عقدة TableScan في الخطة عند استخدام forceIndex: "primary".
  • باستخدام وضع "analyze"، يمكنك مقارنة مقاييس الأداء، مثل وقت الاستجابة والمستندات التي تم فحصها وإدخالات الفهرس التي تم فحصها، مع تفعيل "forceIndex" وبدونه لتحسين أداء طلبات البحث.

أفضل الممارسات المتعلّقة بـ forceIndex

على الرغم من أنّ forceIndex يوفّر تحكّمًا أكبر في تنفيذ طلبات البحث، فإنّ أداة تحسين طلبات البحث في Cloud Firestore تكون فعّالة بشكل عام في معظم حالات الاستخدام. ننصحك باتّباع أفضل الممارسات التالية عند استخدام forceIndex:

  • استخدِم forceIndex بحكمة. إذا لاحظت أداءً دون المستوى المطلوب في خطة طلب البحث التلقائية، استخدِم Query Explain لتشخيص المشكلة قبل فرض فهرس.
  • عند استخدام forceIndex، احرص على اختبار طلبات البحث باستخدام أحجام بيانات واقعية لفهم خصائص الأداء والتكلفة.
  • تجنَّب استخدام forceIndex: "primary" في المجموعات الكبيرة في بيئات التشغيل الفعلي.

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