sql >> Databáze >  >> NoSQL >> MongoDB

Výkon MongoDB Find:jeden složený index VS dva indexy s jedním polem

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ď:

  1. 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é.
  2. 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ů).
  3. 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).
  4. 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 ne age vzhledem k tomu, že mnoho lidí bude mít stejný age (tak nízká selektivita) ve srovnání s name (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ýší




  1. Python + Memcached:Efektivní ukládání do mezipaměti v distribuovaných aplikacích

  2. Kde stojí mongodb v teorému CAP?

  3. MongoDB:CHYBA:podřízený proces se nezdařil, ukončeno s chybou číslo 14

  4. Připojte data k existujícímu souboru gridfs