En esta página, se proporcionan ejemplos de estrategias de indexación que se deben usar en las búsquedas con filtros de rango y desigualdad en varios campos para crear una experiencia de consulta eficiente.
Lee sobre los conceptos relacionados antes de optimizar tus consultas.
Optimiza las consultas con Explicación de consultas
Para determinar si la consulta y los índices usados son óptimos, puedes usar la Explicación de consultas para obtener el resumen del plan de consultas y las estadísticas de ejecución de la consulta:
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);
En el siguiente ejemplo, se muestra cómo el uso del orden correcto de los índices reduce la cantidad de entradas de índice que analiza Cloud Firestore.
Consultas simples
En el ejemplo anterior de una colección de empleados, la consulta simple que se ejecuta con el índice (experience ASC, salary ASC)
es la siguiente:
Java
db.collection("employees")
.whereGreaterThan("salary", 100000)
.whereGreaterThan("experience", 0)
.orderBy("experience")
.orderBy("salary");
La consulta escanea 95,000 entradas de índice solo para devolver 5 documentos. Dado que no se cumple con el predicado de la consulta, se lee una gran cantidad de entradas de índice, pero se filtran.
// 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" } } }
A partir de la experiencia en el área, podemos inferir que la mayoría de los empleados tendrán algo de experiencia, pero pocos tendrán un salario superior a 100,000. Con esta estadística, podemos concluir que la restricción salary
es más selectiva que la restricción experience
. Para influir en el índice que Cloud Firestore usa para ejecutar la consulta, especifica una cláusula orderBy
que ordene la restricción salary
antes de la restricción experience
.
Java
db.collection("employees")
.whereGreaterThan("salary", 100000)
.whereGreaterThan("experience", 0)
.orderBy("salary")
.orderBy("experience");
Cuando usas explícitamente la cláusula orderBy()
para agregar los predicados, Cloud Firestore usa el índice (salary ASC, experience ASC)
para ejecutar la
consulta. Por lo tanto, debido a que la selectividad del primer filtro de rango es mayor en esta consulta en comparación con la consulta anterior, la consulta se ejecuta más rápido y es más rentable.
// 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" } } }
Pasos siguientes
- Obtén más información sobre Explicación de las consultas.
- Obtén más información sobre las prácticas recomendadas de indexación.