MongoDB consulta el rendimiento de más de 5 millones de registros

Recientemente alcanzamos los> 2 millones de registros de una de nuestras principales colecciones y ahora empezamos a sufrir por los principales problemas de rendimiento en esa colección.

Los documentos de la colección tienen aproximadamente 8 campos que puede filtrar mediante la interfaz de usuario y se supone que los resultados se ordenarán por un campo de marca de tiempo en el que se procesó el registro.

He agregado varios índices compuestos con los campos filtrados y la marca de tiempo, por ejemplo:

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

También he agregado un par de índices para usar varios filtros a la vez para, con suerte, lograr un mejor rendimiento. Pero algunos filtros todavía tardan mucho tiempo en ejecutarse.

Me he asegurado de que utilizando explique que las consultas utilizan los índices que he creado, pero el rendimiento aún no es lo suficientemente bueno.

Me preguntaba si el camino es el camino a seguir ahora ... pero pronto comenzaremos a tener alrededor de 1 millón de registros nuevos por día en esa colección ... así que no estoy seguro de si se escalará bien ...

EDITAR: ejemplo para una 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"
}

tenga en cuenta que deviceType solo tiene 2 valores en mi colección.

Respuestas a la pregunta(3)

Su respuesta a la pregunta