Optimalizátor dotazů MongoDB funguje tak, že zkouší různé plány, aby určil, který přístup je pro daný dotaz nejlepší. Vítězný plán pro tento vzor dotazu je poté uložen do mezipaměti pro dalších ~1000 dotazů nebo dokud neprovedete explain()
.
Abyste pochopili, které plány dotazů byly zvažovány, měli byste použít explain(1)
, např.:
db.col.find({category:'A'}).sort({updated: -1}).explain(1)
allPlans
detail zobrazí všechny plány, které byly porovnány.
Pokud spustíte dotaz, který není příliš selektivní (například pokud mnoho záznamů odpovídá vašim kritériím {category: { $ne:'A'}}
), může být pro MongoDB rychlejší najít výsledky pomocí základního kurzoru (prohledávání tabulky) než porovnávat s indexem.
Pořadí polí v dotazu obecně nehraje roli při výběru indexu (existuje několik výjimek s dotazy na rozsah). Pořadí polí v řazení ovlivňuje výběr indexu. Pokud vaše sort()
kritéria neodpovídají pořadí indexu, výsledná data je třeba po použití indexu znovu seřadit (měli byste vidět scanAndOrder:true
ve výstupu vysvětlení, pokud k tomu dojde).
Za zmínku také stojí, že MongoDB použije pouze jeden index na dotaz (s výjimkou $or
s).
Pokud se tedy pokoušíte optimalizovat dotaz:
db.col.find({category:'A'}).sort({updated: -1, rating: -1})
Do indexu budete chtít zahrnout všechna tři pole:
db.col.ensureIndex({category: 1, updated: -1, rating: -1})
Pro informaci, pokud chcete přinutit konkrétní dotaz k použití indexu (obecně to není potřeba ani doporučeno), existuje hint()
možnost, kterou můžete vyzkoušet.