Sommaire

Forcer l’utilisation d’un index avec hinthint

L’opérateur $hint sert à forcer une requête à utiliser un index donné. Il possède une méthode raccourcie dans le shell, qui s’applique à un curseur et possède la forme suivante :

db.collection.find( < critères > ).hint( < index > )

Si vous listez l’ensemble de la collection meteo tout en appliquant explain sur le curseur qui en résulte, vous constaterez qu’un COLLSCAN est opéré, ce qui semble logique :

db.meteo.find().explain()

"winningPlan" : { 
   "stage" : "COLLSCAN", 
   "direction" : "forward" 
},

Maintenant forçons l’utilisation de l’index posé sur le champ ville et appliquons explain sur le tout pour confirmer le changement de stratégie de l’optimisateur de requête, auquel nous avons quelque peu forcé la main :

db.meteo.find({}).hint({"ville": 1}).explain()

Le plan gagnant est bien de type IXSCAN dorénavant !

"winningPlan" : { 
"stage" : "IXSCAN", 
"direction" : "forward" 
},

À retenir

Les index sont là pour optimiser les requêtes. Même s’ils pénalisent les modifications et les insertions des documents en raison de la reconstruction qu’elles demandent, leurs bénéfices sont largement supérieurs ...