2013-10-25 16 views
12

Mam potok agregacyjny match-unwind-group-sort w Mongo 2.4.4 i muszę przyspieszyć agregację.Optymalizacja indeksu dla szkieletu mongodb agregacji

Operacja dopasowywania składa się z zapytań o zakres 16 pól. Użyłem metody .explain() do optymalizacji zapytań dotyczących zakresu (tj. Tworzenia indeksów złożonych). Czy istnieje podobna funkcja optymalizacji agregacji? Szukam czegoś takiego:

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

Czy mam rację, aby skoncentrować się na optymalizacji indeksu?

+1

Jest w najnowszym niestabilny: https://jira.mongodb.org/browse/SERVER-4504 ale do tej pory nie, i nie nie ma indeksy będące korzystanie piłkę mathc jako taki optimsation indeks nie jest dobra ścieżka – Sammaye

+0

@Samaj, to źle, mecz z całą pewnością korzysta z indeksów jak sortuje. –

+0

@AsyaKamsky To właśnie powiedziałem, faktycznie powiedziałem OSTAĆ mecz, tj. W grupie $ – Sammaye

Odpowiedz

14

W przypadku pierwszego pytania można wyjaśnić dane zagregowane.

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

Na drugim, indeksy tworzone w celu optymalizacji zapytań zakres będzie również zastosowanie do $ mecz etapie rurociągu agregacji, jeżeli występują one na początku rurociągu. Więc masz rację, skupiając się na optymalizacji indeksu.

Zobacz .

Aktualizacja 2

Więcej o łącznej i wyjaśnić: od wersji 2.4 jest zawodna; w wersji 2.6+ nie zawiera danych wykonania zapytania. https://groups.google.com/forum/#!topic/mongodb-user/2LzAkyaNqe0

Aktualizacja 1

Zapis agregacji wyjaśnić na 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 
} 

Wersja serwerowa.

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

możesz tłumaczyć tylko zapytania agregacyjne w niestabilnym, jako że nie należy uważać, że możesz, musisz uświadomić tej osobie, że nie jest ona gotowa do produkcji a wersja jest niestabilna i prawdopodobnie ulegnie zmianie – Sammaye

+0

Nie, możesz wyjaśnić agregacje w MongoDB 2.4. Ciągle to robię. – Rafa

+0

Naprawdę? Czy możesz to udowodnić? Może pokazać wyjście z wyjaśnienia? – Sammaye