2013-10-25 5 views
12

Ich habe eine match-unwind-group-sort Aggregation Pipeline in Mongo 2.4.4 und ich muss die Aggregation beschleunigen.Index-Optimierung für Mongodb Aggregation Framework

Die Vergleichsoperation besteht aus Bereichsabfragen in 16 Feldern. Ich habe die Methode .explain() verwendet, um Bereichsabfragen zu optimieren (d. H. Zusammengesetzte Indizes zu erstellen). Gibt es eine ähnliche Funktion zur Optimierung der Aggregation? Ich suche nach etwas wie:

db.col.aggregate([]).explain() 

Auch, bin ich richtig, auf die Indexoptimierung zu konzentrieren?

+1

Es ist in den neuesten instabil: https://jira.mongodb.org/browse/SERVER-4504 aber bis dahin nicht, und nicht dort keine Indizes ist die Verwendung über die mathc als solcher Index optimsation nicht ist ein guter Weg – Sammaye

+0

@Sammaye, das ist falsch, Spiel verwendet sicherlich Indexe wie Sortieren. –

+0

@AsyaKamsky Das ist, was ich gerade gesagt habe, sagte ich tatsächlich Vergangenheit das Spiel, d. H. In der $ Gruppe – Sammaye

Antwort

14

Für die erste Frage, ja, können Sie Aggregate erklären.

db.collection.runCommand("aggregate", {pipeline: YOUR_PIPELINE, explain: true}) 

Für die zweite, die Indizes Sie die Bereichsabfragen zu optimieren erstellen gilt auch für die $ Spiel Stufe der Aggregation-Pipeline, wenn sie am Anfang der Pipeline auftreten. Sie haben also Recht, sich auf Indexoptimierungen zu konzentrieren.

Siehe Pipeline Operators and Indexes.

aktualisieren 2

Mehr über Aggregat und erklären: auf Version 2.4 ist es unzuverlässig; auf 2.6+ bietet es keine Abfrageausführungsdaten. https://groups.google.com/forum/#!topic/mongodb-user/2LzAkyaNqe0

aktualisieren 1

Transcript einer Aggregation erklären auf MongoDB 2.4.5.

$ mongo so 
MongoDB shell version: 2.4.5 
connecting to: so 
> db.q19329239.runCommand("aggregate", {pipeline: [{$group: {_id: '$user.id', hits: {$sum: 1}}}, {$match: {hits: {$gt: 10}}}], explain: true}) 
{ 
    "serverPipeline" : [ 
     { 
      "query" : { 

      }, 
      "projection" : { 
       "user.id" : 1, 
       "_id" : 0 
      }, 
      "cursor" : { 
       "cursor" : "BasicCursor", 
       "isMultiKey" : false, 
       "n" : 1031, 
       "nscannedObjects" : 1031, 
       "nscanned" : 1031, 
       "nscannedObjectsAllPlans" : 1031, 
       "nscannedAllPlans" : 1031, 
       "scanAndOrder" : false, 
       "indexOnly" : false, 
       "nYields" : 0, 
       "nChunkSkips" : 0, 
       "millis" : 0, 
       "indexBounds" : { 

       }, 
       "allPlans" : [ 
        { 
         "cursor" : "BasicCursor", 
         "n" : 1031, 
         "nscannedObjects" : 1031, 
         "nscanned" : 1031, 
         "indexBounds" : { 

         } 
        } 
       ], 
       "server" : "ficrm-rafa.local:27017" 
      } 
     }, 
     { 
      "$group" : { 
       "_id" : "$user.id", 
       "hits" : { 
        "$sum" : { 
         "$const" : 1 
        } 
       } 
      } 
     }, 
     { 
      "$match" : { 
       "hits" : { 
        "$gt" : 10 
       } 
      } 
     } 
    ], 
    "ok" : 1 
} 

Serverversion.

$ mongo so 
MongoDB shell version: 2.4.5 
connecting to: so 
> db.version() 
2.4.5 
+0

sagte, können Sie nur Aggregation Abfragen in der Unstable als solche erklären sollte es nicht in Betracht ziehen, dass Sie können, müssen Sie die Person bewusst machen, dass dies nicht produktionsreif ist und die Version ist instabil und wahrscheinlich zu ändern – Sammaye

+0

Nein, Sie können Aggregationen in MongoDB 2.4 erklären. Das mache ich die ganze Zeit. – Rafa

+0

Wirklich ?? Können Sie das beweisen? Vielleicht die Ausgabe einer Erklärung zeigen? – Sammaye