Wenn eine Abfrage durch mehrere in der Sammlung definierte Indizes erfüllt werden kann, testet MongoDB alle anwendbaren Indizes parallel. Der erste Index, der 101 Ergebnisse zurückgeben kann, wird vom Abfrageplaner ausgewählt. Die Indexauswahl hat andere Facetten, aber im Allgemeinen gilt dies gemäß Suchanfragenoptimierung Dokumentation.
Dieses Indexauswahlverfahren kann einen suboptimalen Index auswählen. Dies liegt daran, dass Sie aus Sicht von MongoDB mehrere Indizes haben, die dasselbe beschreiben. Um die suboptimale Indexauswahl, die Sie beobachtet haben, abzumildern, können Sie Folgendes tun:
-
Entfernen Sie alle anderen Indizes, die Sie als suboptimal entdecken.
Damit soll sichergestellt werden, dass der Abfrageplaner keine andere Wahl hat, als Indizes auszuwählen, die Sie auf Ihre Abfrage zugeschnitten haben.
-
Verwenden Sie den
hint()
Methodehint()
können Sie MongoDB explizit anweisen, den vorgeschriebenen Index für die Abfrage zu verwenden. Zum Beispiel:db.tasks.find(...).hint({project: 1, created_by: 1})
Siehe https://docs.mongodb.com/v2. 6/reference/operator/meta/hint/ für weitere Informationen zu
hint()
.
Eine weitere Nuance in Ihrer Abfrage ist, dass sie ein $or
enthält Operator. In diesem Fall jeder Begriff im $or
Ausdruck muss ein Index zugeordnet sein , andernfalls führt MongoDB einen Sammlungsscan durch (BasicCursor
in MongoDB 2.6-Termen). Dies wird ausführlicher unter https://docs erklärt .mongodb.com/v2.6/reference/operator/query/or/#behaviors