تقدّم هذه الصفحة أمثلة على استراتيجية الفهرسة التي يمكنك استخدامها للاستعلامات التي تتضمّن فلاتر النطاق وعدم المساواة في حقول متعددة من أجل توفير تجربة استعلام فعّالة.
قبل تحسين طلبات البحث، اطّلِع على المفاهيم ذات الصلة.
تحسين طلبات البحث باستخدام Query Explain
لتحديد ما إذا كان طلب البحث والفهارس مناسبَين، يمكنك استخدام Query Explain للحصول على ملخّص خطة طلب البحث وإحصاءات التنفيذ الخاصة بطلب البحث:
Query q = db.collection("employees").whereGreaterThan("salary",
100000).whereGreaterThan("experience", 0);
ExplainResults<QuerySnapshot> explainResults = q.explain(ExplainOptions.builder().analyze(true).build()).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
ExecutionStats executionStats = metrics.getExecutionStats();
System.out.println(planSummary.getIndexesUsed());
System.out.println(stats.getResultsReturned());
System.out.println(stats.getExecutionDuration());
System.out.println(stats.getReadOperations());
System.out.println(stats.getDebugStats());
let q = db.collection("employees")
.where("salary", ">", 100000)
.where("experience", ">",0);
let options = { analyze : 'true' };
let explainResults = await q.explain(options);
let planSummary = explainResults.metrics.planSummary;
let stats = explainResults.metrics.executionStats;
console.log(planSummary);
console.log(stats);
يوضّح المثال التالي كيف يقلّل استخدام ترتيب الفهرس الصحيح عدد إدخالات الفهرس التي يتم فحصها.Cloud Firestore
طلبات البحث البسيطة
باستخدام المثال السابق لمجموعة من الموظفين، يكون طلب البحث البسيط الذي يتم تنفيذه باستخدام الفهرس (experience ASC, salary ASC)
على النحو التالي:
db.collection("employees")
.whereGreaterThan("salary", 100000)
.whereGreaterThan("experience", 0)
.orderBy("experience")
.orderBy("salary");
يفحص طلب البحث 95,000 إدخال فهرس فقط لعرض خمسة مستندات. بما أنّ شرط البحث غير مستوفى، يتم قراءة عدد كبير من إدخالات الفهرس ولكن يتم استبعادها.
// Output query planning info { "indexesUsed": [ { "properties": "(experience ASC, salary ASC, __name__ ASC)", "query_scope": "Collection" } ], // Output Query Execution Stats "resultsReturned": "5", "executionDuration": "2.5s", "readOperations": "100", "debugStats": { "index_entries_scanned": "95000", "documents_scanned": "5", "billing_details": { "documents_billable": "5", "index_entries_billable": "95000", "small_ops": "0", "min_query_cost": "0" } } }
يمكنك الاستنتاج من الخبرة في المجال أنّ معظم الموظفين لديهم بعض الخبرة على الأقل، ولكن القليل منهم يحصلون على راتب يزيد عن 100,000 دولار أمريكي. بناءً على هذه الإحصاءات، يمكنك ملاحظة أنّ القيد salary
أكثر تحديدًا من القيد experience
. للتأثير في الفهرس الذي تستخدمه Cloud Firestore لتنفيذ طلب البحث، حدِّد عبارة orderBy
ترتّب قيد salary
قبل قيد experience
.
db.collection("employees")
.whereGreaterThan("salary", 100000)
.whereGreaterThan("experience", 0)
.orderBy("salary")
.orderBy("experience");
عند استخدام عبارة orderBy()
بشكل صريح لإضافة المسندات، تستخدم Cloud Firestore الفهرس (salary ASC, experience ASC)
لتنفيذ طلب البحث.
بما أنّ انتقائية فلتر النطاق الأول أعلى في هذا الاستعلام مقارنةً بالاستعلام السابق، يتم تنفيذ الاستعلام بشكل أسرع ويكون أكثر فعالية من حيث التكلفة.
// Output query planning info { "indexesUsed": [ { "properties": "(salary ASC, experience ASC, __name__ ASC)", "query_scope": "Collection" } ], // Output Query Execution Stats "resultsReturned": "5", "executionDuration": "0.2s", "readOperations": "6", "debugStats": { "index_entries_scanned": "1000", "documents_scanned": "5", "billing_details": { "documents_billable": "5", "index_entries_billable": "1000", "small_ops": "0", "min_query_cost": "0" } } }