Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ /

Analisar o desempenho da query

Nesta página

  • Avalie o desempenho de uma query

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.

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:

Documentos da coleção de inventário Compass

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 exibe COLLSCAN 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 exibe 3 para indicar que o plano de query vencedor retorna três documentos.

  • executionStats.totalKeysExamined exibe 0 para indicar que esta query não está usando um índice.

  • executionStats.totalDocsExamined exibe 10 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:

  1. Clique Explain Plan na guia test.inventory collection.

  2. Clique em Explain.

O MongoDB Compass exibe o plano de query da seguinte maneira:

Plano de query Compass sem índice

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.

  • 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.

Os detalhes explicativos também podem ser visualizados no formato JSON bruto clicando em Raw JSON abaixo da barra de consulta:

Plano de query Compass sem índice JSON bruto

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.

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 exibe IXSCAN para indicar o uso do índice.

  • executionStats.nReturned exibe 3 para indicar que o plano de query vencedor retorna três documentos.

  • executionStats.totalKeysExamined 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 que o mongod só precisou examinar as chaves do índice para retornar os resultados. O 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.

  • executionStats.totalDocsExamined exibe 3 para indicar que o MongoDB digitalizou três documentos.

  1. Clique Indexes na guia test.inventory collection.

  2. Clique em Create Index.

  3. Selecione quantity no menu suspenso Select a field name.

  4. Selecione 1 (asc) no menu suspenso de tipos.

  5. 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:

Compass mostra novo índice

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:

Plano de explicação do Compass com índice
  • 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 que mongod 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 e IXSCAN. IXSCAN indica que o mongod utilizou um índice para satisfazer a query antes de executar o estágio FETCH e recuperar os documentos.

Os detalhes explicativos também podem ser visualizados no formato JSON bruto clicando em Raw JSON abaixo da barra de consulta:

Plano de consulta Compass com JSON bruto de índice

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.

Dica

Veja também:

Voltar

Conceitos de CRUD