Als aan een zoekopdracht kan worden voldaan door meerdere indexen die in de verzameling zijn gedefinieerd, test MongoDB alle toepasselijke indexen parallel. De eerste index die 101 resultaten kan opleveren, wordt geselecteerd door de queryplanner. Er zijn andere facetten om selectie te indexeren, maar in het algemeen is dit waar volgens de Query-optimalisatie documentatie.
Deze indexselectiemethode kan een suboptimale index selecteren. Dit komt omdat je vanuit het oogpunt van MongoDB meerdere indexen hebt die hetzelfde beschrijven. Om de suboptimale indexselectie die u heeft waargenomen te verminderen, kunt u het volgende doen:
-
Verwijder alle andere indexen waarvan u ontdekt dat ze niet optimaal zijn.
Dit is om ervoor te zorgen dat de queryplanner geen andere keuze heeft dan indexen te kiezen die u op maat heeft gemaakt voor uw zoekopdracht.
-
Gebruik de
hint()
methodehint()
stelt u in staat om MongoDB expliciet te vertellen om de voorgeschreven index voor de query te gebruiken. Bijvoorbeeld:db.tasks.find(...).hint({project: 1, created_by: 1})
Zie https://docs.mongodb.com/v2. 6/referentie/operator/meta/hint/ voor meer informatie over
hint()
.
Een andere nuance in uw zoekopdracht is dat deze een $or
. bevat exploitant. In dit geval, elke term in de $or
expressie moet een bijbehorende index hebben , anders voert MongoDB een collectiescan uit (BasicCursor
in MongoDB 2.6 termen). Dit wordt in meer detail uitgelegd op https://docs .mongodb.com/v2.6/reference/operator/query/or/#behaviors