MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Pourquoi différents plans de requête MongoDB affichent une valeur nReturned différente ?

Cela a été expliqué dans le mode d'exécution allPlans page documentaire. Pour paraphraser :

Lors de la sélection du plan, s'il y a plus d'un index qui peut satisfaire une requête, MongoDB exécutera un essai en utilisant tous les plans valides pour déterminer lequel a été le meilleur. Voir Plans de requête pour plus de détails concernant ce processus.

À partir de MongoDB 3.4.6, la sélection du plan implique d'exécuter des plans candidats en parallèle dans une "course" et de voir quel plan candidat renvoie 101 résultats en premier. Dans votre exemple ci-dessus, au moment où le plan gagnant a renvoyé 101 résultats dans la course, le plan perdant n'a réussi que 2 résultats. Le plan gagnant est ensuite exécuté jusqu'à son terme. C'est la raison pour laquelle le plan perdant n'affiche que nReturned: 2 dans les statistiques.

Cette "course" est effectuée car s'il y a deux plans d'apparence identique, MongoDB ne sait pas quel plan est le meilleur pour une requête particulière en raison de la flexibilité des documents JSON (contrairement par exemple à SQL où la structure des tables est connue) . Bien sûr, il est tout à fait possible que MongoDB devine mal et se retrouve avec un plan moins performant, car il s'agit d'un processus empirique. Pour cette raison, il est préférable de créer des index qui prennent en charge vos requêtes afin que MongoDB n'ait pas à deviner. Sinon, vous pouvez utiliser hint() pour indiquer à MongoDB quel index utiliser pour une certaine requête.

D'où :

  • Les statistiques du plan gagnant sont les statistiques de résultat de la requête réelle.
  • Les statistiques pour le(s) plan(s) perdant(s) n'affichent que les statistiques de l'exécution d'essai de planification de requête.
  • La sélection du plan consiste à organiser une "course" à 101 résultats. Cette course n'est effectuée que lorsqu'il existe plusieurs index pouvant satisfaire la requête.

Remarque 1 :Aucun des deux plans que vous avez vus n'était génial. Le plan gagnant affiche "nReturned" : 43 , "totalKeysExamined" : 221 , et "totalDocsExamined" : 219 . Cela signifie que MongoDB n'a besoin d'examiner que 219 documents pour en renvoyer 43 :seulement 20 % d'efficacité . Idéalement, vous voulez avoir le nReturned nombres égaux à totalDocsExamined .

Remarque 2  :Essayez de créer l'index composé {'rack_name': 1, 'timestamp': 1} . Avec la même requête, vous devriez obtenir un meilleur chiffre d'efficacité.

Remarque 3 :Notez que depuis allPlansExecution a été spécifié, tous les statistiques vous sont dûment renvoyées par MongoDB pour plus de rigueur, alors qu'elles n'ont aucune incidence sur le nReturned final résultat. C'était un plan rejeté, et le nReturned: 2 numéro peut être déroutant. Vous ne verrez pas ces statistiques si vous utilisez executionStats paramètre. Principalement, le allPlansExecution est utilisé pour affiner et déterminer pourquoi certains plans sont rejetés.