Si une requête peut être satisfaite par plusieurs index définis dans la collection, MongoDB testera tous les index applicables en parallèle. Le premier index pouvant renvoyer 101 résultats sera sélectionné par le planificateur de requêtes. Il existe d'autres facettes de la sélection d'index, mais en général, cela est vrai selon le Optimisation des requêtes documents.
Ce procédé de sélection d'index peut sélectionner un index sous-optimal. En effet, du point de vue de MongoDB, vous avez plusieurs index qui décrivent la même chose. Pour atténuer la sélection d'index sous-optimale que vous avez observée, vous pouvez :
-
Supprimez tous les autres index que vous découvrez comme étant sous-optimaux.
Cela permet de s'assurer que le planificateur de requêtes n'a pas d'autre choix que de choisir les index que vous avez adaptés à votre requête.
-
Utilisez le
hint()
méthodehint()
vous permet de dire explicitement à MongoDB d'utiliser l'index prescrit pour la requête. Par exemple :db.tasks.find(...).hint({project: 1, created_by: 1})
Veuillez consulter https://docs.mongodb.com/v2. 6/reference/operator/meta/hint/ pour plus d'informations sur
hint()
.
Une autre nuance dans votre requête est qu'elle inclut un $or
opérateur. Dans ce cas, chaque terme du $or
l'expression doit avoir un index associé , sinon MongoDB effectuera un scan de collection (BasicCursor
en termes MongoDB 2.6). Ceci est expliqué plus en détail sur https://docs .mongodb.com/v2.6/reference/operator/query/or/#behaviors