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“