MongoDB consultando desempenho para mais de 5 milhões de registros

Recentemente, atingimos os 2 milhões de registros de uma de nossas principais coleções e agora começamos a sofrer por problemas importantes de desempenho nessa coleção.

Os documentos na coleção têm cerca de oito campos que você pode filtrar usando a interface do usuário e os resultados devem ser classificados por um campo de registro de data e hora em que o registro foi processado.

Eu adicionei vários índices compostos com os campos filtrados e o horário, por exemplo:

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

Eu também adicionei alguns índices para usar vários filtros de uma vez para obter um melhor desempenho. Mas alguns filtros ainda demoram muito tempo para serem executados.

Eu me certifiquei de que usando explicar que as consultas usam os índices que eu criei, mas o desempenho ainda não é bom o suficiente.

Eu queria saber se sharding é o caminho a percorrer agora .. mas em breve começaremos a ter cerca de 1 milhão de novos registros por dia nessa coleção .. então não tenho certeza se vai escalar bem ..

EDIT: exemplo para uma consulta:

> 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"
}

Por favor note que deviceType tem apenas 2 valores na minha coleção.

questionAnswers(3)

yourAnswerToTheQuestion