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

Mongodb Explain pro agregační rámec

Počínaje MongoDB verze 3.0 jednoduše změňte pořadí od

collection.aggregate(...).explain()

do

collection.explain().aggregate(...)

vám poskytne požadované výsledky (dokumentace zde).

Pro starší verze>=2.6 budete muset použít explain možnost pro operace agregačního potrubí

explain:true

db.collection.aggregate([
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { $group: { 
        _id : "$_id",
        count: { $sum:1 } 
    }},
    {$sort: {"count":-1}}
  ],
  {
    explain:true
  }
)

Důležitým aspektem u Aggregation Framework je, že index lze použít pouze k načtení počátečních dat pro kanál (např. použití $match , $sort , $geonear na začátku kanálu) a také následující $lookup a $graphLookup etapy. Jakmile jsou data načtena do agregačního kanálu ke zpracování (např. průchod fázemi jako $project , $unwind a $group ) další manipulace bude v paměti (možná pomocí dočasných souborů, pokud allowDiskUse možnost je nastavena).

Optimalizace kanálů

Obecně můžete optimalizovat agregační kanály:

  • Spuštění kanálu pomocí $match fázi omezit zpracování na relevantní dokumenty.
  • Zajištění počáteční $match / $sort fáze jsou podporovány účinným indexem.
  • Včasné filtrování dat pomocí $match , $limit a $skip .
  • Minimalizace zbytečných fází a manipulace s dokumenty (možná přehodnocení schématu, pokud je vyžadována složitá agregační gymnastika).
  • Využití novějších operátorů agregace, pokud jste upgradovali svůj server MongoDB. Například MongoDB 3.4 přidal mnoho nových agregačních fází a výrazů včetně podpory pro práci s poli, řetězci a fazetami.

Existuje také řada optimalizací agregačního kanálu, ke kterým dochází automaticky v závislosti na verzi vašeho serveru MongoDB. Sousední stupně mohou být například sloučeny a/nebo přeuspořádány, aby se zlepšilo provádění bez ovlivnění výstupních výsledků.

Omezení

Stejně jako v MongoDB 3.4 agregační rámec explain Tato možnost poskytuje informace o tom, jak je kanál zpracováván, ale nepodporuje stejnou úroveň podrobností jako executionStats režim pro find() dotaz. Pokud se zaměřujete na optimalizaci počátečního provádění dotazu, pravděpodobně bude pro vás přínosem prostudovat si ekvivalentní find().explain() dotaz pomocí executionStats nebo allPlansExecution upovídanost.

Existuje několik relevantních požadavků na funkce ke sledování/hlasování v nástroji pro sledování problémů MongoDB ohledně podrobnějších statistik provádění, které pomohou optimalizovat/profilovat agregační kanály:

  • SERVER-19758:Přidejte do vysvětlení agregace režimy vysvětlení „executionStats“ a „allPlansExecution“
  • SERVER-21784:Sledujte statistiky provádění pro každou fázi agregačního kanálu a odhalte pomocí vysvětlení
  • SERVER-22622:Vylepšete vysvětlení $lookup pro označení plánu dotazů v kolekci „od“


  1. MongoDB:V cestě bylo nalezeno příliš mnoho pozičních (tj. '$') prvků

  2. MongoDB projekce vnořených polí

  3. Zálohování a obnovení MongoDB

  4. MongoDB Zobrazit veškerý obsah ze všech kolekcí