MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Por que planos de consulta diferentes do MongoDB mostram valor nReturned diferente?


Isso foi explicado no allPlansExecution Mode página de documentação. Parafrasear:

Durante a seleção do plano, se houver mais de um índice que possa satisfazer uma consulta, o MongoDB executará um teste usando todos os planos válidos para determinar qual deles teve o melhor desempenho. Consulte Planos de consulta para detalhes sobre este processo.

A partir do MongoDB 3.4.6, a seleção de planos envolve a execução de planos candidatos em paralelo em uma "corrida" e ver qual plano candidato retorna 101 resultados primeiro. No seu exemplo acima, quando o plano vencedor retornou 101 resultados na corrida, o plano perdedor conseguiu apenas 2 resultados. O plano vencedor então é executado até a conclusão. Esta é a razão pela qual o plano perdedor mostra apenas nReturned: 2 nas estatísticas.

Essa "corrida" é realizada, pois se houver dois planos de aparência idêntica, o MongoDB não sabe qual plano é o melhor para uma consulta específica devido à flexibilidade dos documentos JSON (diferente de, por exemplo, SQL, onde a estrutura das tabelas é conhecida) . Claro, é inteiramente possível que o MongoDB adivinhe errado e acabe com um plano com desempenho inferior, já que é um processo empírico. Por esse motivo, é melhor criar índices que suportem suas consultas para que o MongoDB não precise adivinhar. Caso contrário, você pode usar hint() para informar ao MongoDB qual índice usar para uma determinada consulta.

Por isso:
  • As estatísticas do plano vencedor são as estatísticas reais do resultado da consulta.
  • As estatísticas dos planos perdedores mostram apenas as estatísticas da execução de teste de planejamento de consulta.
  • A seleção do plano envolve uma "corrida" para 101 resultados. Essa corrida só é realizada quando há vários índices que podem satisfazer a consulta.

Observação 1 :Nenhum dos dois planos que você viu foi ótimo. O plano vencedor mostra "nReturned" : 43 , "totalKeysExamined" : 221 , e "totalDocsExamined" : 219 . Isso significa que o MongoDB precisa examinar 219 documentos apenas para retornar 43 deles:apenas 20% de eficiência . Idealmente, você deseja ter o nReturned números iguais a totalDocsExamined .

Observação 2 :Tente criar o índice composto {'rack_name': 1, 'timestamp': 1} . Com a mesma consulta, você deve obter um número de eficiência melhor.

Observação 3 :Observe que desde allPlansExecution foi especificado, todos as estatísticas são devidamente devolvidas a você pelo MongoDB para fins de detalhamento, embora não tenham qualquer relação com o nReturned final resultado. Era um plano rejeitado e o nReturned: 2 número pode ser confuso. Você não verá essas estatísticas se usar executionStats contexto. Principalmente, o allPlansExecution é usado para ajustar e determinar por que alguns planos são rejeitados.