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

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

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

پرس و جوها را با 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 ورودی فهرست را فقط برای برگرداندن 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"
        }
    }
}

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

بعد چه است