इस पेज पर, इंडेक्स करने की रणनीति के उदाहरण दिए गए हैं. इनका इस्तेमाल, कई फ़ील्ड पर रेंज और असमानता वाले फ़िल्टर के साथ क्वेरी के लिए किया जा सकता है. इससे क्वेरी का बेहतर अनुभव मिलता है.
अपनी क्वेरी को ऑप्टिमाइज़ करने से पहले, इससे जुड़े कॉन्सेप्ट के बारे में पढ़ें.
क्वेरी एक्सप्लेन की मदद से क्वेरी ऑप्टिमाइज़ करना
आपकी क्वेरी और इंडेक्स सही हैं या नहीं, यह पता लगाने के लिए Query Explain का इस्तेमाल किया जा सकता है. इससे क्वेरी प्लान की खास जानकारी और क्वेरी के लागू होने के आंकड़े मिलते हैं:
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 इंडेक्स एंट्री को स्कैन करती है, ताकि सिर्फ़ पांच दस्तावेज़ दिखाए जा सकें. क्वेरी प्रेडिकेट पूरा न होने की वजह से, इंडेक्स की कई एंट्री पढ़ी जाती हैं, लेकिन उन्हें फ़िल्टर कर दिया जाता है.
// 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" } } }
डोमेन एक्सपर्टीज़ से यह अनुमान लगाया जा सकता है कि ज़्यादातर कर्मचारियों के पास कम से कम कुछ अनुभव होगा. हालांकि, कुछ कर्मचारियों की सैलरी 1,00,000 से ज़्यादा होगी. इस अहम जानकारी से पता चलता है कि salary की पाबंदी, experience की पाबंदी के मुकाबले ज़्यादा चुनिंदा है. क्वेरी को लागू करने के लिए, Cloud Firestore जिस इंडेक्स का इस्तेमाल करता है उस पर असर डालने के लिए, orderBy क्लॉज़ की जानकारी दें. यह क्लॉज़, experience कंस्ट्रेंट से पहले salary कंस्ट्रेंट को ऑर्डर करता है.
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" } } }
आगे क्या करना है
- क्वेरी एक्सप्लेन के बारे में जानें.
- इंडेक्स करने के सबसे सही तरीकों के बारे में जानें.