MongoDB-frågeoptimeraren fungerar genom att prova olika planer för att avgöra vilket tillvägagångssätt som fungerar bäst för en given fråga. Den vinnande planen för det frågemönstret cachelagras sedan för nästa ~1 000 frågor eller tills du gör en explain()
.
För att förstå vilka frågeplaner som övervägdes bör du använda explain(1)
, t.ex.:
db.col.find({category:'A'}).sort({updated: -1}).explain(1)
allPlans
detalj kommer att visa alla planer som jämfördes.
Om du kör en fråga som inte är särskilt selektiv (till exempel om många poster matchar dina kriterier för {category: { $ne:'A'}}
), kan det vara snabbare för MongoDB att hitta resultat med en BasicCursor (tabellskanning) snarare än att matcha mot ett index.
Ordningen på fälten i frågan gör i allmänhet ingen skillnad för indexvalet (det finns några få undantag med intervallfrågor). Ordningen på fält i en sortering påverkar indexvalet. Om din sort()
kriterierna inte matchar indexordningen, resultatdata måste sorteras om efter att indexet har använts (du bör se scanAndOrder:true
i förklara-utgången om detta händer).
Det är också värt att notera att MongoDB endast kommer att använda ett index per fråga (med undantag för $or
s).
Så om du försöker optimera frågan:
db.col.find({category:'A'}).sort({updated: -1, rating: -1})
Du vill inkludera alla tre fälten i indexet:
db.col.ensureIndex({category: 1, updated: -1, rating: -1})
FYI, om du vill tvinga en viss fråga att använda ett index (vanligtvis inte behövs eller rekommenderas), det finns en hint()
alternativ du kan prova.