Analisar o desempenho da query
Nesta página
Os cursor.explain("executionStats")
e os métodos db.collection.explain("executionStats")
fornecem estatísticas sobre o desempenho de uma query. Essas estatísticas podem ser úteis para medir se e como uma query utiliza um índice. Consulte db.collection.explain()
para detalhes.
O MongoDB Compass fornece uma aba Plano de explicação, que exibe estatísticas sobre o desempenho de uma query. Essas estatísticas podem ser úteis para medir se e como uma query utiliza um índice.
Avalie o desempenho de uma query
Considere uma coleção inventory
com os seguintes documentos:
{ "_id" : 1, "item" : "f1", type: "food", quantity: 500 } { "_id" : 2, "item" : "f2", type: "food", quantity: 100 } { "_id" : 3, "item" : "p1", type: "paper", quantity: 200 } { "_id" : 4, "item" : "p2", type: "paper", quantity: 150 } { "_id" : 5, "item" : "f3", type: "food", quantity: 300 } { "_id" : 6, "item" : "t1", type: "toys", quantity: 500 } { "_id" : 7, "item" : "a1", type: "apparel", quantity: 250 } { "_id" : 8, "item" : "a2", type: "apparel", quantity: 400 } { "_id" : 9, "item" : "t2", type: "toys", quantity: 50 } { "_id" : 10, "item" : "f4", type: "food", quantity: 75 }
Os documentos aparecem no MongoDB Compass como os seguintes:
Consulta sem Índice
A query a seguir recupera documentos em que o campo
quantity
tem um valor entre 100
e 200
,
inclusive:
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } )
A consulta retorna os seguintes documentos:
{ "_id" : 2, "item" : "f2", "type" : "food", "quantity" : 100 } { "_id" : 3, "item" : "p1", "type" : "paper", "quantity" : 200 } { "_id" : 4, "item" : "p2", "type" : "paper", "quantity" : 150 }
Para exibir o plano de query selecionado, encadeie o método cursor.explain("executionStats")
cursor até o final do comando find:
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } ).explain("executionStats")
explain()
retorna os seguintes resultados:
{ "queryPlanner" : { "plannerVersion" : 1, ... "winningPlan" : { "stage" : "COLLSCAN", ... } }, "executionStats" : { "executionSuccess" : true, "nReturned" : 3, "executionTimeMillis" : 0, "totalKeysExamined" : 0, "totalDocsExamined" : 10, "executionStages" : { "stage" : "COLLSCAN", ... }, ... }, ... }
queryPlanner.winningPlan.stage
exibeCOLLSCAN
para indicar uma verificação de collection.As verificações de collection indicam que
mongod
precisou verificar documento por documento de toda a collection para identificar os resultados. Essa é uma operação geralmente cara e pode resultar em queries lentas.executionStats.nReturned
exibe3
para indicar que o plano de query vencedor retorna três documentos.executionStats.totalKeysExamined
exibe0
para indicar que esta query não está usando um índice.executionStats.totalDocsExamined
exibe10
para indicar que o MongoDB teve que verificar dez documentos (ou seja, todos os documentos na collection) para encontrar os três documentos correspondentes.
A query a seguir recupera documentos em que o campo
quantity
tem um valor entre 100
e 200
,
inclusive:
Copie o seguinte filtro na barra de query do Compass e clique em Find:
{ quantity: { $gte: 100, $lte: 200 } }
A consulta retorna os seguintes documentos:
Para visualizar o plano de query selecionado:
Clique Explain Plan na guia
test.inventory
collection.Clique em Explain.
O MongoDB Compass exibe o plano de query da seguinte maneira:
Observação
Como estamos trabalhando com um conjunto de dados tão pequeno para os fins deste tutorial, o Actual Query Execution Time exibe 0
segundos, mesmo que não estejamos usando um índice.
Em um conjunto de dados maior, a diferença no tempo de execução da query entre uma query indexada e uma query não indexada seria muito maior.
Árvore visual
O Query Performance Summary mostra as estatísticas de execução da consulta:
Documents Returned exibe
3
para indicar que o plano de query vencedor retorna três documentos.Index Keys Examined exibe
0
para indicar que essa query não está usando um índice.Documents Examined exibe
10
para indicar que o MongoDB teve que verificar dez documentos (ou seja, todos os documentos na coleção) para encontrar os três documentos correspondentes.
Abaixo de Query Performance Summary, o MongoDB Compass exibe o estágio de consulta
COLLSCAN
para indicar que uma verificação de collection foi usada para esta consulta.As verificações de collection indicam que
mongod
precisou verificar documento por documento de toda a collection para identificar os resultados. Essa é uma operação geralmente cara e pode resultar em queries lentas.
Raw JSON
Os detalhes explicativos também podem ser visualizados no formato JSON bruto clicando em Raw JSON abaixo da barra de consulta:
A diferença entre o número de documentos correspondentes e o número de documentos examinados pode sugerir que, para melhorar a eficiência, a query pode se beneficiar do uso de um índice.
Consulta com índice
Para suportar a query no campo quantity
, adicione um índice no campo quantity
:
db.inventory.createIndex( { quantity: 1 } )
Para visualizar as estatísticas do plano de query, use o método explain()
:
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } ).explain("executionStats")
O método explain()
retorna os seguintes resultados:
{ "queryPlanner" : { "plannerVersion" : 1, ... "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "quantity" : 1 }, ... } }, "rejectedPlans" : [ ] }, "executionStats" : { "executionSuccess" : true, "nReturned" : 3, "executionTimeMillis" : 0, "totalKeysExamined" : 3, "totalDocsExamined" : 3, "executionStages" : { ... }, ... }, ... }
queryPlanner.winningPlan.inputStage.stage
exibeIXSCAN
para indicar o uso do índice.executionStats.nReturned
exibe3
para indicar que o plano de query vencedor retorna três documentos.executionStats.totalKeysExamined
exibe3
para indicar que o MongoDB verificou três entradas de índice. O número de chaves examinadas corresponde ao número de documentos retornados, o que significa que omongod
só precisou examinar as chaves do índice para retornar os resultados. Omongod
não precisou digitalizar todos os documentos, e apenas os três documentos correspondentes tiveram que ser colocados na memória. Isso resulta em uma query muito eficiente.executionStats.totalDocsExamined
exibe3
para indicar que o MongoDB digitalizou três documentos.
Clique Indexes na guia
test.inventory
collection.Clique em Create Index.
Selecione
quantity
no menu suspenso Select a field name.Selecione
1 (asc)
no menu suspenso de tipos.Clique em Create.
Observação
Deixar o campo do nome do índice em branco faz com que o MongoDB Compass crie um nome padrão para o índice.
Agora você pode ver o índice recém-criado na guia Indexes:
Retorne à aba Explain Plan para a coleção inventory
e execute novamente a query da etapa anterior:
{ quantity: { $gte: 100, $lte: 200 } }
O MongoDB Compass exibe o plano de query da seguinte maneira:
Árvore visual
O Query Performance Summary mostra as estatísticas de execução da consulta:
Documents Returned exibe
3
para indicar que o plano de query vencedor retorna três documentos.Index Keys Examined exibe
3
para indicar que o MongoDB verificou três entradas de índice. O número de chaves examinadas corresponde ao número de documentos retornados, o que significa quemongod
só precisou examinar as chaves do índice para retornar os resultados.mongod
não precisou digitalizar todos os documentos, e apenas os três documentos correspondentes tiveram que ser colocados na memória. Isso resulta em uma query muito eficiente.Documents Examined exibe
3
para indicar que o MongoDB verificou três documentos.No lado direito do Query Performance Summary, o MongoDB Compass mostra que a query usou o índice
quantity
.
Abaixo do Query Performance Summary, o MongoDB Compass exibe os estágios de query
FETCH
eIXSCAN
.IXSCAN
indica que omongod
utilizou um índice para satisfazer a query antes de executar o estágioFETCH
e recuperar os documentos.
Raw JSON
Os detalhes explicativos também podem ser visualizados no formato JSON bruto clicando em Raw JSON abaixo da barra de consulta:
Sem o índice, a query verificaria toda a collection de 10
documentos para retornar 3
documentos correspondentes. A query também precisou verificar a totalidade de cada documento, potencialmente colocando-os na memória. Isso resulta em uma operação de query cara e potencialmente lenta.
Ao executar com um índice, a query verificou 3
entradas de índice e 3
documentos para retornar 3
documentos correspondentes, resultando em uma query muito eficiente.