คำอธิบายการค้นหาช่วยให้คุณส่งการค้นหา Cloud Firestore ไปยังแบ็กเอนด์และรับสถิติประสิทธิภาพโดยละเอียดเกี่ยวกับการดำเนินการค้นหาแบ็กเอนด์ได้ ซึ่งทำหน้าที่เหมือนการดำเนินการ EXPLAIN [ANALYZE]
ในระบบฐานข้อมูลเชิงสัมพันธ์จำนวนมาก
คุณส่งคำขอคำอธิบายการค้นหาได้โดยใช้ไลบรารีของไคลเอ็นต์เซิร์ฟเวอร์ Firestore
ผลการค้นหาอธิบายข้อความค้นหาช่วยให้คุณเข้าใจการดำเนินการกับข้อความค้นหา ซึ่งแสดงให้เห็นถึงความไร้ประสิทธิภาพและตำแหน่งจุดคอขวดฝั่งเซิร์ฟเวอร์ที่น่าจะเป็น
คำอธิบายข้อความค้นหา:
- ให้ข้อมูลเชิงลึกในขั้นตอนการวางแผนการค้นหาเพื่อให้คุณปรับดัชนีการค้นหาและเพิ่มประสิทธิภาพได้
- การใช้ตัวเลือก "การวิเคราะห์" จะช่วยให้คุณเข้าใจค่าใช้จ่ายและประสิทธิภาพแบบต่อข้อความค้นหา และช่วยให้ทำซ้ำได้อย่างรวดเร็วผ่านรูปแบบการค้นหาต่างๆ เพื่อเพิ่มประสิทธิภาพการใช้งาน
ทำความเข้าใจตัวเลือกอธิบายการค้นหา: ค่าเริ่มต้นและวิเคราะห์
คุณดำเนินการอธิบายการค้นหาได้โดยใช้ตัวเลือกเริ่มต้นหรือตัวเลือกการวิเคราะห์
เมื่อใช้ตัวเลือกเริ่มต้น Query Explain จะวางแผนการค้นหา แต่จะข้ามขั้นตอนการดำเนินการ ระบบจะแสดงข้อมูลระยะของเครื่องมือวางแผน ซึ่งคุณสามารถใช้เพื่อตรวจสอบว่าการค้นหามีดัชนีที่จำเป็นหรือไม่ และทำความเข้าใจดัชนีที่ใช้ วิธีนี้จะช่วยให้คุณตรวจสอบได้ว่าการค้นหาหนึ่งๆ กำลังใช้ดัชนีผสมหรือไม่โดยการซ้อนทับกับดัชนีต่างๆ จำนวนมาก
ตัวเลือกการวิเคราะห์ทำให้ Query Explain ทั้งแผนและเรียกใช้การค้นหา ซึ่งจะแสดงผลข้อมูลเครื่องมือวางแผนที่กล่าวถึงก่อนหน้านี้ทั้งหมด พร้อมกับสถิติจากรันไทม์การดำเนินการค้นหา ซึ่งจะรวมถึงข้อมูลการเรียกเก็บเงินของการค้นหา พร้อมกับข้อมูลเชิงลึกระดับระบบในการดำเนินการค้นหา คุณสามารถใช้เครื่องมือนี้เพื่อทดสอบการกำหนดค่าการค้นหาและดัชนีต่างๆ เพื่อเพิ่มประสิทธิภาพให้กับต้นทุนและเวลาในการตอบสนอง
Query Explain มีค่าใช้จ่ายเท่าไร
เมื่อคุณใช้ "คำอธิบายการค้นหา" กับตัวเลือกเริ่มต้น ระบบจะไม่ดำเนินการจัดทำดัชนีหรืออ่าน ระบบจะเรียกเก็บเงินการดำเนินการอ่าน 1 ครั้งโดยไม่คำนึงถึงความซับซ้อนของคำค้นหา
เมื่อคุณใช้ "คำอธิบายการค้นหา" กับตัวเลือกการวิเคราะห์ ระบบจะดำเนินการจัดทำดัชนีและการอ่าน ดังนั้นคุณจะถูกเรียกเก็บเงินสำหรับคำค้นหาตามปกติ ไม่มีค่าใช้จ่ายเพิ่มเติมสำหรับกิจกรรมการวิเคราะห์ แต่จะเรียกเก็บเฉพาะการเรียกเก็บเงินตามปกติสำหรับการค้นหาที่ดำเนินการอยู่
ใช้ "คำอธิบายการค้นหา" กับตัวเลือกเริ่มต้น
คุณสามารถใช้ไลบรารีของไคลเอ็นต์เพื่อส่งคำขอตัวเลือกเริ่มต้น
โปรดทราบว่าคำขอได้รับการตรวจสอบสิทธิ์ด้วย IAM โดยใช้สิทธิ์เดียวกันสำหรับการดำเนินการค้นหาตามปกติ ระบบจะไม่สนใจเทคนิคการตรวจสอบสิทธิ์อื่นๆ เช่น การตรวจสอบสิทธิ์ของ Firebase ดูข้อมูลเพิ่มเติมได้ในคู่มือเกี่ยวกับ IAM สำหรับไลบรารีของไคลเอ็นต์เซิร์ฟเวอร์
Java (ผู้ดูแลระบบ)
Query q = db.collection("col").whereGreaterThan("a", 1);
ExplainOptions options = ExplainOptions.builder().build();
ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
โหนด (ผู้ดูแลระบบ)
const q = db.collection('col').where('country', '=', 'USA');
const options = { analyze : 'false' };
const explainResults = await q.explain(options);
const metrics = explainResults.metrics;
const plan = metrics.planSummary;
รูปแบบการตอบสนองที่แน่นอนจะขึ้นอยู่กับสภาพแวดล้อมการดำเนินการ ผลลัพธ์ที่แสดงจะแปลงเป็น JSON ได้ เช่น
{ "indexes_used": [ {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"}, {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"}, ] }
สำหรับข้อมูลเพิ่มเติม โปรดดูข้อมูลอ้างอิงรายงานที่อธิบายข้อความค้นหา
ใช้ Query Explain กับตัวเลือกการวิเคราะห์
คุณสามารถใช้ไลบรารีของไคลเอ็นต์เพื่อส่งคำขอตัวเลือกการวิเคราะห์ได้
โปรดทราบว่าคำขอได้รับการตรวจสอบสิทธิ์ด้วย IAM โดยใช้สิทธิ์เดียวกันสำหรับการดำเนินการค้นหาตามปกติ ระบบจะไม่สนใจเทคนิคการตรวจสอบสิทธิ์อื่นๆ เช่น การตรวจสอบสิทธิ์ของ Firebase ดูข้อมูลเพิ่มเติมได้ในคู่มือเกี่ยวกับ IAM สำหรับไลบรารีของไคลเอ็นต์เซิร์ฟเวอร์
Java (ผู้ดูแลระบบ)
Query q = db.collection("col").whereGreaterThan("a", 1);
ExplainOptions options = ExplainOptions.builder().setAnalyze(true).build();
ExplainResults<QuerySnapshot> explainResults = q.explain(options).get();
ExplainMetrics metrics = explainResults.getMetrics();
PlanSummary planSummary = metrics.getPlanSummary();
List<Map<String, Object>> indexesUsed = planSummary.getIndexesUsed();
ExecutionStats stats = metrics.getExecutionStats();
โหนด (ผู้ดูแลระบบ)
const q = db.collection('col').where('country', '=', 'USA');
const options = { analyze : 'true' };
const explainResults = await q.explain(options);
const metrics = explainResults.metrics;
const plan = metrics.planSummary;
const indexesUsed = plan.indexesUsed;
const stats = metrics.executionStats;
ตัวอย่างต่อไปนี้แสดงออบเจ็กต์ stats
ที่แสดงผลเพิ่มเติมจาก planInfo
รูปแบบการตอบสนองที่แน่นอนจะขึ้นอยู่กับสภาพแวดล้อมการดำเนินการ ตัวอย่างการตอบกลับจะอยู่ในรูปแบบ JSON
{ "resultsReturned": "5", "executionDuration": "0.100718s", "readOperations": "5", "debugStats": { "index_entries_scanned": "95000", "documents_scanned": "5" "billing_details": { "documents_billable": "5", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }
สำหรับข้อมูลเพิ่มเติม โปรดดูข้อมูลอ้างอิงรายงานที่อธิบายข้อความค้นหา
ตีความผลลัพธ์และทำการปรับเปลี่ยน
ลองมาดูตัวอย่างสถานการณ์ที่เราค้นหาภาพยนตร์ตามประเภทและประเทศที่ผลิต
สำหรับภาพประกอบ ให้สมมติสิ่งที่เทียบเท่ากับการค้นหา SQL นี้
SELECT * FROM /movies WHERE category = 'Romantic' AND country = 'USA';
ถ้าเราใช้ตัวเลือกการวิเคราะห์ เมตริกที่แสดงผลจะแสดงการเรียกใช้คำค้นหาในดัชนีช่องเดียว 2 ช่อง คือ (category ASC, __name__ ASC)
และ (country ASC, __name__ ASC)
โดยจะสแกนรายการดัชนี 16, 500 รายการ แต่แสดงผลเอกสารเพียง 1200 รายการ
// Output query planning info { "indexes_used": [ {"query_scope": "Collection", "properties": "(category ASC, __name__ ASC)"}, {"query_scope": "Collection", "properties": "(country ASC, __name__ ASC)"}, ] } // Output query status { "resultsReturned": "1200", "executionDuration": "0.118882s", "readOperations": "1200", "debugStats": { "index_entries_scanned": "16500", "documents_scanned": "1200" "billing_details": { "documents_billable": "1200", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }
หากต้องการเพิ่มประสิทธิภาพการดำเนินการค้นหา คุณสามารถสร้างดัชนีผสม (category ASC, country ASC, __name__ ASC)
ที่ครอบคลุมทั้งตัว
การเรียกใช้การค้นหาด้วยตัวเลือกการวิเคราะห์อีกครั้งเราจะเห็นว่ามีการเลือกดัชนีที่สร้างขึ้นใหม่สำหรับการค้นหานี้ และการค้นหาจะทำงานเร็วขึ้นและมีประสิทธิภาพขึ้นมาก
// Output query planning info { "indexes_used": [ {"query_scope": "Collection", "properties": "(category ASC, country ASC, __name__ ASC)"} ] } // Output query stats { "resultsReturned": "1200", "executionDuration": "0.026139s", "readOperations": "1200", "debugStats": { "index_entries_scanned": "1200", "documents_scanned": "1200" "billing_details": { "documents_billable": "1200", "index_entries_billable": "0", "small_ops": "0", "min_query_cost": "0", } } }