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