Este capítulo presenta el análisis del rendimiento de consultas en MongoDB, similar a la opción explain en SQL, MongoDB también admite explain para analizar el rendimiento de las sentencias de consulta.
Uso básico
Llamando a la función explain, puedes obtener el resultado del análisis
// Resultado del análisis del método find
db.collection.find({}).explain();
// Resultado del análisis del método aggregate
db.collection.explain().aggregate([]);
explain tiene tres modos:
- queryPlanner (predeterminado)
- executionStats
- allPlansExecution
Explicación:
- Usar queryPlanner lista todos los posibles planes de ejecución, no ejecuta la declaración real y muestra el plan winningPlan que ya ha ganado.
- Usar executionStats ejecuta solo el plan winningPlan y muestra el resultado.
- Usar allPlansExecution ejecuta todos los planes y muestra los resultados.
Uso de diferentes modos
// Modo executionStats, simplemente pasa parámetros a la función explain
db.collection.find({}).explain('executionStats');
// Modo allPlansExecution
db.collection.find({}).explain('allPlansExecution');
Explicación del contenido de explain
Contenido de queryPlanner
El siguiente contenido es el contenido predeterminado devuelto por explain, ignorando la información no clave
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.orders",
"indexFilterSet" : false, // Métrica clave, si se utiliza el filtrado de índice de datos
"winningPlan" : {
"stage" : "COLLSCAN", // Métrica clave, nombre de la fase de etapa. Cada fase tiene información específica de la fase, por ejemplo, COLLSCAN representa el escaneo de todo el contenido de la colección
"direction" : "forward"
},
"rejectedPlans" : [ ]
}
...
}
Los tipos de fase de etapa son los siguientes:
- COLLSCAN: Escaneo completo de tabla
- IXSCAN: Escaneo de índice
- FETCH: Recuperar documentos específicos basados en el índice
- SHARD_MERGE: Fusionar datos devueltos por cada fragmento
- SORT: Indica la clasificación en memoria
- LIMIT: Limitar el número de retornos
- SKIP: Omitir usando
- IDHACK: Consulta de _id
- SHARDING_FILTER: Consulta de datos fragmentados a través de mongos
- COUNT: Operaciones de conteo usando db.coll.explain().count() o similar
- COUNTSCAN: Etapa devuelta cuando el recuento no está utilizando un índice para contar
- COUNT_SCAN: Etapa devuelta cuando el recuento está utilizando un índice para contar
- SUBPLA: Etapa devuelta para consultas $or que no utilizan índices
- TEXT: Etapa devuelta al consultar usando índices de texto completo
- PROJECTION: Etapa de retorno para limitar los campos devueltos
Contenido de executionStats
El siguiente contenido es el contenido devuelto en modo executionStats, ignorando la información no clave
{
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 5, // Número de documentos devueltos
"executionTimeMillis" : 0, // Tiempo de ejecución
"totalKeysExamined" : 0, // Cuántos índices se examinan
"totalDocsExamined" : 5, // Número total de documentos examinados
"executionStages" : {
"stage" : "COLLSCAN", // Tipo de etapa, COLLSCAN significa escanear toda la tabla
"nReturned" : 5,
"executionTimeMillisEstimate" : 0,
"works" : 7,
"advanced" : 5,
"needTime" : 1,
"needYield" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"direction" : "forward",
"docsExamined" : 5
}
}
}
Ideas de optimización de consulta
- Utilizar índices tanto como sea posible
- Cuantos menos documentos escaneados, mejor