MongoDB-Abfrageleistung für über 5 Millionen Datensätze

Wir haben kürzlich die 2-Millionen-Rekorde für eine unserer Hauptsammlungen erreicht und leiden nun unter schwerwiegenden Leistungsproblemen bei dieser Sammlung.

Die Dokumente in der Sammlung enthalten ungefähr 8 Felder, die Sie mithilfe der Benutzeroberfläche filtern können. Die Ergebnisse sollen nach einem Zeitstempelfeld sortiert sein, in dem der Datensatz verarbeitet wurde.

Ich habe mehrere zusammengesetzte Indizes mit den gefilterten Feldern und dem Zeitstempel hinzugefügt, z. B .:

db.events.ensureIndex({somefield: 1, timestamp:-1})

Ich habe auch einige Indizes für die gleichzeitige Verwendung mehrerer Filter hinzugefügt, um hoffentlich eine bessere Leistung zu erzielen. Einige Filter benötigen jedoch immer noch sehr viel Zeit.

Ich habe mithilfe von EXPLAIN sichergestellt, dass die Abfragen die von mir erstellten Indizes verwenden, die Leistung jedoch immer noch nicht ausreichend ist.

Ich habe mich gefragt, ob Sharding der richtige Weg ist, aber wir werden bald ungefähr 1 Million neue Datensätze pro Tag in dieser Sammlung haben. Ich bin mir nicht sicher, ob es gut skaliert.

EDIT: Beispiel für eine Abfrage:

> db.audit.find({'userAgent.deviceType': 'MOBILE', 'user.userName': {$in: ['nickey@acme.com']}}).sort({timestamp: -1}).limit(25).explain()
{
        "cursor" : "BtreeCursor user.userName_1_timestamp_-1",
        "isMultiKey" : false,
        "n" : 0,
        "nscannedObjects" : 30060,
        "nscanned" : 30060,
        "nscannedObjectsAllPlans" : 120241,
        "nscannedAllPlans" : 120241,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 1,
        "nChunkSkips" : 0,
        "millis" : 26495,
        "indexBounds" : {
                "user.userName" : [
                        [
                                "nickey@acme.com",
                                "nickey@acme.com"
                        ]
                ],
                "timestamp" : [
                        [
                                {
                                        "$maxElement" : 1
                                },
                                {
                                        "$minElement" : 1
                                }
                        ]
                ]
        },
        "server" : "yarin:27017"
}

Bitte beachten Sie, dass deviceType nur 2 Werte in meiner Sammlung hat.