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