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.