2017-02-03 7 views
-1

Ich habe Aggregat Abfrage mit der Sammlung mit 40k Dokumente.Mongo Aggregat Abfrage dauert eine lange Zeit

{ aggregate: "REV_TABLE", pipeline: [ { $match: { r: { $lte: 1486066601 }, ISDI_ID: "17" } }, { $group: { _id: "$l", maxVer: { $max: "$r" } } } ] } 

Ich habe zwei Indizes: { "r": 1} und { "r": 1, "ISDI": 1} und Hintergrund Indizierung ist. Anfangs, als die Dokumente klein waren, dauerte es < 100ms. Jetzt ist es um 35k + es dauert mehr als 300ms.

Ist das erwartet und ich rate 35k ist nicht so groß, aber warum ist die Abfrage so lange zurück zu kommen.

+0

Ist der zusammengesetzte Index auf '{" r ": 1," ISDI ": 1}' oder '{" r ": 1," ISDI_ID ": 1}'? –

Antwort

1

Ich schlage vor, einen Blick auf die Dokumentation für Analyzing Query Performance in MongoDB.

Sie können Sie abfragen, mit .explain("executionStats") am Ende davon (zB db.collection.aggregate(yourQuery).explain('executionStats')) laufen, und Sie erhalten eine Ausgabe der Analyse der Leistung eines jeden Teil der Abfrage, einschließlich Zeiten für Index-Scans erhalten, welche Indizes verwendet werden, usw. Dann können Sie Schritte unternehmen, um Ihre Anfrage zu optimieren. Oder, wenn Sie nichts mehr tun können, um es zu optimieren, dann werden Sie wissen, dass es nur eine Konsequenz aus einer großen Menge an Dokumenten ist, die Sie zu aggregieren versuchen.

Denken Sie daran, Aggregation ist auch in der Regel für "Admin-Backends" und Datenanalysen und wird nicht so häufig in Consumer-Anwendungen verwendet, da Aggregation schwer ist. Das Sammeln von Sammlungen dauert sehr lange.

Sie können auch veranlassen, dass MongoDB automatisch die Abfragepläne für langsame Abfragen in eine Sammlung für Sie ablegt (lesen Sie Database Profiling in MongoDB).

Zum Beispiel Dump db.setProfilingLevel(1,20) wird den Abfrageplan aller Ops über 20ms in eine Sammlung namens system.profile Dump.

Verwandte Themen