หน้านี้แสดงตัวอย่างกลยุทธ์การจัดทําดัชนีที่คุณสามารถใช้สําหรับการค้นหาด้วยตัวกรองช่วงและความไม่เท่าเทียมในหลายช่องเพื่อสร้างประสบการณ์การค้นหาที่มีประสิทธิภาพ
โปรดอ่านเกี่ยวกับแนวคิดที่เกี่ยวข้องก่อนที่จะเพิ่มประสิทธิภาพข้อความค้นหา
เพิ่มประสิทธิภาพการค้นหาด้วยคําอธิบายคําค้นหา
หากต้องการทราบว่าคำค้นหาและดัชนีของคุณมีประสิทธิภาพสูงสุดหรือไม่ ให้ใช้อธิบายคำค้นหาเพื่อรับข้อมูลสรุปแผนการค้นหาและสถิติการดำเนินการของคำค้นหา
Java
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());
Node.js
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)
จะเป็นดังนี้
Java
db.collection("employees")
.whereGreaterThan("salary", 100000)
.whereGreaterThan("experience", 0)
.orderBy("experience")
.orderBy("salary");
การค้นหาจะสแกนรายการดัชนี 95,000 รายการเพื่อแสดงเอกสาร 5 รายการเท่านั้น เนื่องจากไม่เป็นไปตามเงื่อนไขการค้นหา จะมีการอ่านรายการดัชนีจำนวนมากแต่ถูกกรองออก
// 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
Java
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" } } }
ขั้นตอนถัดไป
- ดูข้อมูลเกี่ยวกับคําอธิบายการค้นหา
- ดูข้อมูลเกี่ยวกับแนวทางปฏิบัติแนะนำในการจัดทำดัชนี