Запрос производительности MongoDB для более чем 5 миллионов записей

Недавно мы достигли> 2 миллионов записей для одной из наших основных коллекций, и теперь мы стали страдать из-за серьезных проблем с производительностью этой коллекции.

Эти документы в коллекции имеют около 8 полей, которые можно отфильтровать с помощью пользовательского интерфейса, и результаты должны быть отсортированы по полю отметки времени, в котором была обработана запись.

Я добавил несколько составных индексов с отфильтрованными полями и временной меткой, например:

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

Я также добавил несколько индексов для использования нескольких фильтров одновременно, чтобы надеяться на более высокую производительность. Но некоторые фильтры все еще работают ужасно долго.

Я убедился, что с помощью объяснения, что запросы используют индексы, которые я создал, но производительность все еще недостаточно хороша.

Мне было интересно, подходит ли сейчас использование шардинга ... но скоро мы начнем иметь около 1 миллиона новых записей в день в этой коллекции ... поэтому я не уверен, будет ли она хорошо масштабироваться ...

РЕДАКТИРОВАТЬ: пример для запроса:

> 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,
        "scanAnd,Order" : 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"
}

пожалуйста, обратите внимание, что deviceType имеет только 2 значения в моей коллекции.