Analyse de requête

L'analyse de requêtes MongoDB permet de vérifier si les index que nous avons créés sont efficaces, et constitue un outil important pour l'analyse des performances des instructions de requête.

Les fonctions courantes utilisées dans l'analyse de requêtes MongoDB incluent : explain() et hint().


Utilisation de explain()

L'opération explain fournit des informations sur les requêtes, l'utilisation des index et des statistiques de requête, etc. Elle nous aide à optimiser les index.

Ensuite, nous créons des index sur gender et user_name dans la collection users :

>db.users.ensureIndex({gender:1,user_name:1})

Maintenant, utilisons explain dans l'instruction de requête :

>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()

La requête explain() ci-dessus renvoie les résultats suivants :

{
   "cursor" : "BtreeCursor gender_1_user_name_1",
   "isMultiKey" : false,
   "n" : 1,
   "nscannedObjects" : 0,
   "nscanned" : 1,
   "nscannedObjectsAllPlans" : 0,
   "nscannedAllPlans" : 1,
   "scanAndOrder" : false,
   "indexOnly" : true,
   "nYields" : 0,
   "nChunkSkips" : 0,
   "millis" : 0,
   "indexBounds" : {
      "gender" : [
         [
            "M",
            "M"
         ]
      ],
      "user_name" : [
         [
            {
               "$minElement" : 1
            },
            {
               "$maxElement" : 1
            }
         ]
      ]
   }
}

Maintenant, examinons les champs de ce jeu de résultats :

  • indexOnly: Le champ vaut true, ce qui indique que nous avons utilisé un index.
  • cursor: Étant donné que cette requête utilise un index, et que dans MongoDB les index sont stockés dans une structure de type B-tree, elle utilise également un curseur de type BtreeCursor. Si aucun index n'est utilisé, le type de curseur est BasicCursor. Cette clé donne également le nom de l'index que vous utilisez. Grâce à ce nom, vous pouvez consulter la collection system.indexes de la base de données actuelle (créée automatiquement par le système pour stocker les informations sur les index, ce qui sera mentionné brièvement plus tard) pour obtenir des informations détaillées sur l'index.
  • n: Le nombre de documents renvoyés par la requête actuelle.
  • nscanned/nscannedObjects: Indique combien de documents de la collection ont été parcourus au total pendant cette requête. Notre objectif est de rendre cette valeur aussi proche que possible du nombre de documents renvoyés.
  • millis: Le temps nécessaire pour la requête actuelle, en millisecondes.
  • indexBounds: L'index spécifique utilisé par la requête actuelle.

Utilisation de hint()

Bien que l'optimiseur de requêtes MongoDB fonctionne généralement assez bien, vous pouvez également utiliser hint pour forcer MongoDB à utiliser un index spécifié.

Cette méthode peut améliorer les performances dans certaines situations. Par exemple, une collection indexée et lors de l'exécution d'une requête portant sur plusieurs champs (où certains champs sont déjà indexés).

L'exemple de requête suivant spécifie l'utilisation des champs d'index gender et user_name pour la requête :

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})

Vous pouvez utiliser la fonction explain() pour analyser la requête ci-dessus :

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()
Autres extensions