MongoDB: análisis de consultas

El análisis de consultas es un aspecto muy importante para medir la eficacia de la base de datos y el diseño de indexación. Aprenderemos sobre los de uso frecuente$explain y $hint consultas.

Usando $ explicar

los $explainEl operador proporciona información sobre la consulta, los índices utilizados en una consulta y otras estadísticas. Es muy útil al analizar qué tan bien están optimizados sus índices.

En el último capítulo, ya habíamos creado un índice para el users colección en campos gender y user_name 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 $explain en la siguiente consulta:

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

La consulta explica () 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:

  • El verdadero valor de indexOnly indica que esta consulta ha utilizado la indexación.

  • los cursorcampo especifica el tipo de cursor utilizado. El tipo BTreeCursor indica que se utilizó un índice y también da el nombre del índice utilizado. BasicCursor indica que se realizó un análisis completo sin utilizar ningún índice.

  • n indica el número de documentos que coinciden devueltos.

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

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

Usando $ hint

los $hintEl operador obliga al optimizador de consultas a utilizar el índice especificado para ejecutar una consulta. Esto es particularmente útil cuando desea probar el rendimiento de una consulta con diferentes índices. Por ejemplo, la siguiente consulta especifica el índice en los camposgender y user_name que se utilizará para esta consulta:

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

Para analizar la consulta anterior usando $ explicar:

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

Lo que 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
}