Zadán prostý standardní dotaz (bez limit()
nebo sort()
nebo cokoli, co bylo použito efektně), který má podmínku filtru ve dvou polích (jako v name
). a age
ve vašem příkladu), za účelem nalezení výsledných dokumentů MongoDB buď:
- proveďte úplné skenování sbírky (přečtěte si každý dokument v celé kolekci, analyzujte BSON, najděte příslušné hodnoty, otestujte je proti vstupu a vraťte/zahoďte každý dokument):Toto je mimořádně intenzivní I/O, a tudíž pomalé.
- použijte jeden index která obsahuje jedno z polí (použijte indexový strom k vyhledání relevantní podmnožiny dokumentů a poté je naskenujte):V závislosti na vaší distribuci dat/selektivitě indexu to může být velmi rychlé nebo sotva poskytovat nějakou výhodu (představte si index na
age
v datové sadě milionů lidí mezi 30 a 40 lety --> každé vyhledání by přesto přineslo nekonečné množství dokumentů). - použijte dva indexy které společně obsahují obě dotyčná pole (načtěte oba indexy, proveďte vyhledávání klíčů a poté vypočítejte průsečík výsledků):Opět platí, že v závislosti na vaší distribuci dat vám to může nebo nemusí poskytnout skvělý výkon. Měl by však být ve většině případů rychlejší než #2. Byl bych však překvapen, kdyby to bylo opravdu 10x pomalejší než #4 (jak jste zmínil).
- použijte složený index (dvě po sobě jdoucí vyhledávání klíčů okamžitě vedou k požadovaným dokumentům):Toto bude nejrychlejší možnost ze všech vzhledem k tomu, že k získání správných dokumentů vyžaduje nejméně a nejlevnější operace. Chcete-li zajistit nejvyšší úroveň opětovného použití (nikoli výkon, který tím nebude ovlivněn), měli byste obecně začít s nejselektivnějším polem jako první, takže ve vašem případě pravděpodobně
name
a neage
vzhledem k tomu, že mnoho lidí bude mít stejnýage
(tak nízká selektivita) ve srovnání sname
(vyšší selektivita). Ale tato volba také závisí na vašem konkrétním scénáři a dotazech, které hodláte spustit proti vaší databázi. Na webu je docela dobrý článek o tom, jak nejlépe definovat složený index s ohledem na různé aspekty vaší konkrétní situace:https://emptysqua.re/blog/optimizing-mongodb-compound-indexes
Další aspekty, které je třeba zvážit, jsou:Aktualizace indexu přicházejí za určitou cenu. Pokud vám však záleží pouze na rychlosti rychlého čtení a máte jen několik aktualizací každou chvíli, pak byste měli sáhnout po více/větších indexech.
A v neposlední řadě (!) dobře používaná rada:Vyprofilujte svůj systém zatraceně pomocí skutečných dat a možná i realistických scénářů zatížení. A také pokračujte v měření, jak se vaše data/systém mění v průběhu času.
Další čtení:https://docs.mongodb.com/manual/core/query-optimization/index.html
https://dba.stackexchange.com/questions/158240/mongodb-index-intersection-does-not-eliminate-the-need-for-creating-compound-in
Průsečík indexu vs. složený index?
mongodb compund index vs. index intersect
Jak záleží na pořadí složených indexů ve výkonu MongoDB?
V MongoDB používám velký dotaz, jak vytvořím složený index nebo jeden index, takže moje doba odezvy se zvýší