MongoDB – Análisis de consultas

El análisis de consultas es un aspecto muy importante para medir el rendimiento de la base de datos y el diseño de indexación. Más información sobre los que se utilizan con frecuencia $ explicar y $ pista peticiones.

Usando $ para explicar

EN $ explicar El operador proporciona información sobre la solicitud, los índices utilizados en la solicitud y otras estadísticas. Esto es muy útil al analizar qué tan bien están optimizados sus índices.

En el capítulo anterior, ya creamos un índice para usuarios colección en los campos Suelo y Nombre de usuario usando la siguiente consulta –

>db.users.createIndex({gender:1,user_name:1})
{
	"numIndexesBefore" : 2,
	"numIndexesAfter" : 2,
	"note" : "all indexes already exist",
	"ok" : 1
}

Ahora usaremos $ explicar en la próxima solicitud –

>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()

La consulta de explicación anterior () devuelve el siguiente resultado analizado:

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "mydb.users",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"gender" : {
				"$eq" : "M"
			}
		},
		"queryHash" : "B4037D3C",
		"planCacheKey" : "DEAAE17C",
		"winningPlan" : {
			"stage" : "PROJECTION_COVERED",
			"transformBy" : {
				"user_name" : 1,
				"_id" : 0
			},
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"gender" : 1,
					"user_name" : 1
				},
				"indexName" : "gender_1_user_name_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"gender" : [ ],
					"user_name" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"gender" : [
						"["M", "M"]"
					],
					"user_name" : [
						"[MinKey, MaxKey]"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"serverInfo" : {
		"host" : "Krishna",
		"port" : 27017,
		"version" : "4.2.1",
		"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
	},
	"ok" : 1
}

Ahora, veremos los campos en este conjunto de resultados:

  • Verdadero valor indexOnly indica que se utilizó la indexación en esta solicitud.

  • EN cursor el campo especifica el tipo de cursor a utilizar. El tipo BTreeCursor indica que se utilizó el índice y también da el nombre del índice que se utilizará. BasicCursor indica que se realizó un análisis completo sin utilizar índices.

  • PAG indica el número de documentos coincidentes devueltos.

  • nscannedObjects indica el número total de documentos escaneados.

  • nscanned indica el número total de documentos escaneados o entradas de índice.

Usando $ hint

EN $ pista El operador obliga al optimizador de consultas a utilizar el índice especificado para ejecutar la consulta. Esto es especialmente útil si desea probar el rendimiento de una consulta con diferentes índices. Por ejemplo, la siguiente consulta especifica el índice de los campos Suelo y Nombre de usuario para su uso en esta solicitud:

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
{ "user_name" : "tombenzamin" }

Para analizar la solicitud anterior usando $ explicación:

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()

Esto le da el siguiente resultado:

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "mydb.users",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"gender" : {
				"$eq" : "M"
			}
		},
		"queryHash" : "B4037D3C",
		"planCacheKey" : "DEAAE17C",
		"winningPlan" : {
			"stage" : "PROJECTION_COVERED",
			"transformBy" : {
				"user_name" : 1,
				"_id" : 0
			},
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"gender" : 1,
					"user_name" : 1
				},
				"indexName" : "gender_1_user_name_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"gender" : [ ],
					"user_name" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"gender" : [
						"["M", "M"]"
					],
					"user_name" : [
						"[MinKey, MaxKey]"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"serverInfo" : {
		"host" : "Krishna",
		"port" : 27017,
		"version" : "4.2.1",
		109
		"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
	},
	"ok" : 1
}

🚫