Hvis en forespørgsel kan tilfredsstilles af flere indekser defineret i samlingen, vil MongoDB teste alle relevante indekser parallelt. Det første indeks, der kan returnere 101 resultater, vil blive valgt af forespørgselsplanlæggeren. Der er andre facetter til indeksudvælgelse, men generelt er dette sandt i henhold til Forespørgselsoptimering dokumentation.
Denne indeksvalgsmetode kan vælge et suboptimalt indeks. Dette skyldes, at du efter MongoDB's synspunkt har flere indekser, der beskriver det samme. For at afbøde det suboptimale indeksvalg, du observerede, kan du gøre:
-
Fjern alle andre indekser, som du opdager er suboptimale.
Dette er for at sikre, at forespørgselsplanlæggeren ikke har andet valg end at vælge indekser, som du har skræddersyet til din forespørgsel.
-
Brug
hint()
metodehint()
giver dig mulighed for eksplicit at fortælle MongoDB at bruge det foreskrevne indeks til forespørgslen. For eksempel:db.tasks.find(...).hint({project: 1, created_by: 1})
Se venligst https://docs.mongodb.com/v2. 6/reference/operatør/meta/hint/ for mere information om
hint()
.
En anden nuance i din forespørgsel er, at den indeholder en $or
operatør. I dette tilfælde hver term i $or
udtryk skal have et indeks tilknyttet , ellers vil MongoDB udføre en samlingsscanning (BasicCursor
i MongoDB 2.6 termer). Dette er forklaret i flere detaljer på https://docs .mongodb.com/v2.6/reference/operator/query/or/#behaviors