پرس و جوها را با فیلترهای محدوده و نابرابری در چندین فیلد بهینه کنید

این صفحه نمونه هایی از استراتژی نمایه سازی را ارائه می دهد که می توانید برای پرس و جوهایی با فیلترهای محدوده و نابرابری در چندین فیلد استفاده کنید تا یک تجربه پرس و جو کارآمد ایجاد کنید.

قبل از اینکه جستارهای خود را بهینه کنید، در مورد مفاهیم مرتبط مطالعه کنید.

پرس و جوها را با 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());

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) اجرا می شود به شرح زیر است:

جاوا

db.collection("employees")
  .whereGreaterThan("salary", 100000)
  .whereGreaterThan("experience", 0)
  .orderBy("experience")
  .orderBy("salary");

پرس و جو 95000 ورودی فهرست را فقط برای برگرداندن پنج سند اسکن می کند. از آنجایی که گزاره پرس و جو برآورده نمی شود، تعداد زیادی از ورودی های فهرست خوانده می شوند اما فیلتر می شوند.

// 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"
        }
    }
}

شما می توانید از تخصص دامنه استنباط کنید که اکثر کارمندان حداقل تجربه ای خواهند داشت، اما تعداد کمی از آنها حقوقی بیش از 100000 خواهند داشت. با توجه به این بینش، می توانید ببینید که محدودیت 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"
        }
    }
}

بعدش چی