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
}