MongoDB - analisando consultas

Analisar consultas é um aspecto muito importante para medir a eficácia do design de banco de dados e indexação. Vamos aprender sobre os usados ​​com freqüência$explain e $hint consultas.

Usando $ explain

o $explainoperador fornece informações sobre a consulta, índices usados ​​em uma consulta e outras estatísticas. É muito útil ao analisar o quão bem seus índices são otimizados.

No último capítulo, já havíamos criado um índice para o users coleção em campos gender e user_name usando a seguinte consulta -

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

Agora vamos usar $explain na seguinte consulta -

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

A consulta explain () acima retorna o seguinte resultado analisado -

{
	"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
}

Vamos agora olhar para os campos neste conjunto de resultados -

  • O verdadeiro valor de indexOnly indica que esta consulta usou indexação.

  • o cursorcampo especifica o tipo de cursor usado. O tipo BTreeCursor indica que um índice foi usado e também fornece o nome do índice usado. BasicCursor indica que uma varredura completa foi feita sem usar nenhum índice.

  • n indica o número de documentos correspondentes retornados.

  • nscannedObjects indica o número total de documentos digitalizados.

  • nscanned indica o número total de documentos ou entradas de índice digitalizadas.

Usando $ hint

o $hintoperador força o otimizador de consulta a usar o índice especificado para executar uma consulta. Isso é particularmente útil quando você deseja testar o desempenho de uma consulta com índices diferentes. Por exemplo, a consulta a seguir especifica o índice nos camposgender e user_name a ser usado para esta consulta -

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

Para analisar a consulta acima usando $ explain -

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

O que dá a você o seguinte 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
}