MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb Explain für das Aggregation-Framework

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