2017-09-21 1 views
0

I Beispiele für Aggregationsanfragen ähnlich wie dies leite:Wie Agregate Abfragen in MongoDB beschleunigen

https://www.compose.com/articles/aggregations-in-mongodb-by-example/

db.mycollection.aggregate([ 
    { 
    { $match: {"nested.field": "1110"}}, { 
    $group: { 
     _id: null, 
     total: { 
     $sum: "$nested.field" 
     }, 
     average_transaction_amount: { 
     $avg: "$nested.field" 
     }, 
     min_transaction_amount: { 
     $min: "$nested.field" 
     }, 
     max_transaction_amount: { 
     $max: "$nested.field" 
     } 
    } 
    } 
]); 

Eine Sammlung, die ich geschaffen habe 5.000.000 große JSON-Dokumente eingefügt (rund 1.000 K- > V Paare, einige sind verschachtelt.

Bevor Sie einen Index für ein verschachteltes Feld hinzufügen, dauert es etwa 5 Minuten, um dieses Feld zu zählen. Nach dem Hinzufügen von Index - für die Zählung dauert es weniger als eine Sekunde (was gut ist).

Jetzt versuche ich SUM oder AVG oder jedes andere Beispiel oben zu tun - es dauert Minuten (nicht Sekunden). Gibt es eine Möglichkeit, aggregierte Abfragen in MongoDB zu verbessern?

Danke!

+1

[Holen Sie sich ein größeres Boot] (http://www.urbandictionary.com/define.php?term=We%27re%20Gonna%20Need%20a%20Bigger%20Boat). Während Sie tun, was Sie können, haben Sie optimale "Abfrage" Auswahl, dauert der schiere Prozess der Verarbeitung einer Menge von Daten erhebliche Zeit. Weitaus mehr als ein Abfrageplaner benötigt, um auszuwerten, wie viele Ergebnisse einem Index entsprechen (insbesondere wenn das alles im Speicher ist). –

+0

Ok .. Ich führe eine ähnliche Abfrage auf MySQL (Summe) für jede Spalte und es dauert weniger als ein paar Sekunden auf 5M Datensätze .. Ich verstehe, dass geschachtelte JSON in MySQL nicht leicht tun kann (oder zumindest nicht so schnell ist) hat für diesen Fall eine bessere Leistung mit Mongo erwartet. Oder vielleicht gibt es noch andere Verbesserungen? (Ich bekomme zufällige JSON von Kunden, so habe ich keine Kontrolle darüber, wie es aussehen wird, bevor es zu mir kommt, aber einige Felder speichern und indexieren müssen). – Joe

+0

Je nachdem wie statisch Ihre Daten sind, könnten Sie diese Abfrage vielleicht alle ausführen X und füge die Ergebnisse in die Dokumente ein. – Skami

Antwort

1

Leider verwendet die Gruppe derzeit keine Indizes in mongodb. Nur sort and match kann Indizes nutzen. Die Abfrage, so wie Sie sie geschrieben haben, ist also so optimiert wie sie sein könnte.

Es gibt ein paar Dinge, die Sie tun könnten. Für max und min können Sie sie einfach abfragen, anstatt das Aggregationsframework zu verwenden. Sie können dann nach $ nested.field sortieren und nur einen nehmen. Sie können einen Index auf $ nested.field setzen und dann mit demselben Index aufsteigend oder absteigend sortieren.

Wenn Sie kontrollieren können, wann die Daten eingefügt werden, und die Abfrage so einfach ist, wie es aussieht, können Sie die Daten selbst verfolgen. Du könntest also einen Tisch in Mongo haben, wo die Sammlung die "Id" oder was auch immer du gruppierst und Felder für "total" und "sum" haben. Sie könnten sie bei Einfügungen erhöhen und dann würden die Gesamt- und Durchschnittswerte schnelle Abfragen sein. Nicht sicher, ob das eine Option für Ihre Situation ist, aber es ist das Beste, was Sie tun können.

Im Allgemeinen ist Mongo super schnell. Meiner Meinung nach ist der einzige Ort, der nicht ganz so gut ist wie SQL, die Aggregation. Die Vorteile überwiegen die Kämpfe für mich. Im Allgemeinen unterhalte ich separate Berichtssammlungen für diese Art von Situation, wie ich es empfohlen habe.

+0

Vielen Dank für eine großartige Antwort auf "wie" mit Mongo. Werde einige dieser Empfehlungen ausprobieren. – Joe