MongoDB sprawdza wydajność dla ponad 5 milionów rekordów

Niedawno trafiliśmy na rekordy> 2 mln dla jednej z naszych głównych kolekcji, a teraz zaczęliśmy cierpieć z powodu poważnych problemów z wydajnością tej kolekcji.

Dokumenty w kolekcji mają około 8 pól, które można filtrować za pomocą interfejsu użytkownika, a wyniki mają być sortowane według pola znacznika czasu, w którym rekord został przetworzony.

Dodałem kilka indeksów złożonych z filtrowanymi polami i datownikiem, np .:

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

Dodałem też kilka indeksów do korzystania z kilku filtrów jednocześnie, aby mieć nadzieję na lepszą wydajność. Ale niektóre filtry wciąż mają strasznie dużo czasu do wykonania.

Upewniłem się, że użycie wyjaśni, że zapytania korzystają z utworzonych przeze mnie indeksów, ale wydajność nadal nie jest wystarczająco dobra.

Zastanawiałem się, czy sharding to sposób, by pójść teraz ... ale wkrótce zaczniemy mieć około 1 miliona nowych rekordów dziennie w tej kolekcji .. więc nie jestem pewien, czy będzie dobrze skalować.

EDYTUJ: przykład dla zapytania:

> db.audit.find({'userAgent.deviceType': 'MOBILE', 'user.userName': {$in: ['[email protected]']}}).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" : [
                        [
                                "[email protected]",
                                "[email protected]"
                        ]
                ],
                "timestamp" : [
                        [
                                {
                                        "$maxElement" : 1
                                },
                                {
                                        "$minElement" : 1
                                }
                        ]
                ]
        },
        "server" : "yarin:27017"
}

proszę zauważyć, że typ urządzenia ma tylko 2 wartości w mojej kolekcji.

questionAnswers(3)

yourAnswerToTheQuestion