Beginnend mit MongoDB Version 3.0 ändern Sie einfach die Reihenfolge von
collection.aggregate(...).explain()
zu
collection.explain().aggregate(...)
liefert Ihnen die gewünschten Ergebnisse (Dokumentation hier).
Für ältere Versionen>=2.6 müssen Sie den explain
verwenden Option für Aggregations-Pipeline-Operationen
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
}
)
Eine wichtige Überlegung beim Aggregation Framework ist, dass ein Index nur zum Abrufen der Anfangsdaten für eine Pipeline verwendet werden kann (z. B. Verwendung von $match
, $sort
, $geonear
am Anfang einer Pipeline) sowie nachfolgendes $lookup
und $graphLookup
Stufen. Sobald Daten zur Verarbeitung in die Aggregationspipeline abgerufen wurden (z. B. durch Phasen wie $project
, $unwind
und $group
) weitere Bearbeitung erfolgt im Arbeitsspeicher (möglicherweise unter Verwendung temporärer Dateien, wenn allowDiskUse
Option gesetzt ist).
Optimierung von Pipelines
Im Allgemeinen können Sie Aggregationspipelines folgendermaßen optimieren:
- Starten einer Pipeline mit einem
$match
Stufe, um die Verarbeitung auf relevante Dokumente zu beschränken. - Gewährleistung des anfänglichen
$match
/$sort
Stadien werden durch einen effizienten Index unterstützt. - Frühes Filtern von Daten mit
$match
,$limit
, und$skip
. - Minimieren Sie unnötige Phasen und Dokumentmanipulation (möglicherweise überdenken Sie Ihr Schema, wenn komplizierte Aggregationsgymnastik erforderlich ist).
- Nutzung neuerer Aggregationsoperatoren, wenn Sie Ihren MongoDB-Server aktualisiert haben. Beispielsweise wurden in MongoDB 3.4 viele neue Aggregationsstufen und -ausdrücke hinzugefügt, einschließlich der Unterstützung für die Arbeit mit Arrays, Zeichenfolgen und Facetten.
Es gibt auch eine Reihe von Aggregations-Pipeline-Optimierungen, die je nach Version Ihres MongoDB-Servers automatisch ausgeführt werden. Beispielsweise können benachbarte Stufen zusammengeführt und/oder neu geordnet werden, um die Ausführung zu verbessern, ohne die Ausgabeergebnisse zu beeinflussen.
Einschränkungen
Ab MongoDB 3.4 ist das Aggregation Framework explain
Die Option stellt Informationen darüber bereit, wie eine Pipeline verarbeitet wird, unterstützt jedoch nicht denselben Detaillierungsgrad wie executionStats
Modus für ein find()
Anfrage. Wenn Sie sich darauf konzentrieren, die anfängliche Abfrageausführung zu optimieren, werden Sie es wahrscheinlich als nützlich empfinden, sich das entsprechende find().explain()
anzusehen Abfrage mit executionStats
oder allPlansExecution
Ausführlichkeit.
Es gibt einige relevante Funktionsanfragen, die im MongoDB-Issue-Tracker im Hinblick auf detailliertere Ausführungsstatistiken zur Optimierung/Profilierung von Aggregationspipelines beobachtet/aufgewertet werden können:
- SERVER-19758:Explain-Modi „executionStats“ und „allPlansExecution“ zu Aggregation Explain hinzugefügt
- SERVER-21784:Verfolgen Sie die Ausführungsstatistiken für jede Phase der Aggregationspipeline und zeigen Sie sie über EXPLAIN an
- SERVER-22622:Verbessern Sie $lookup explain, um den Abfrageplan für die „From“-Sammlung anzuzeigen