MongoDB-forespørgselsoptimeringsværktøjet virker ved at prøve forskellige planer for at bestemme, hvilken tilgang der fungerer bedst for en given forespørgsel. Vinderplanen for det forespørgselsmønster cachelagres derefter for de næste ~1.000 forespørgsler, eller indtil du laver en explain()
.
For at forstå, hvilke forespørgselsplaner der blev overvejet, bør du bruge explain(1)
, f.eks.:
db.col.find({category:'A'}).sort({updated: -1}).explain(1)
allPlans
detaljer vil vise alle planer, der blev sammenlignet.
Hvis du kører en forespørgsel, som ikke er særlig selektiv (f.eks. hvis mange poster matcher dine kriterier for {category: { $ne:'A'}}
), kan det være hurtigere for MongoDB at finde resultater ved hjælp af en BasicCursor (tabelscanning) i stedet for at matche mod et indeks.
Rækkefølgen af felter i forespørgslen generelt ikke gør en forskel for indeksvalget (der er nogle få undtagelser med intervalforespørgsler). Rækkefølgen af felter i en sortering påvirker indeksvalget. Hvis din sort()
kriterierne stemmer ikke overens med indeksrækkefølgen, resultatdataene skal sorteres igen, efter at indekset er brugt (du skal se scanAndOrder:true
i forklare-output, hvis dette sker).
Det er også værd at bemærke, at MongoDB kun vil bruge ét indeks pr. forespørgsel (med undtagelse af $or
s).
Så hvis du forsøger at optimere forespørgslen:
db.col.find({category:'A'}).sort({updated: -1, rating: -1})
Du vil medtage alle tre felter i indekset:
db.col.ensureIndex({category: 1, updated: -1, rating: -1})
FYI, hvis du vil tvinge en bestemt forespørgsel til at bruge et indeks (normalt ikke nødvendigt eller anbefalet), er der et hint()
mulighed du kan prøve.