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.