我们最近已经刷新了我们其中一个主要收藏的200万条记录,现在我们开始因该收藏的主要性能问题而受苦。
它们在集合中的文档大约有8个字段,您可以使用UI对其进行过滤,并且应该按记录处理的时间戳记字段对结果进行排序。
我添加了几个复合索引,其中包含过滤字段和时间戳,例如:
db.events.ensureIndex({somefield: 1, timestamp:-1})
我还添加了几个索引,可以同时使用多个过滤器,以期获得更好的性能。但是某些过滤器仍然需要花费很长时间才能执行。
我已经确保使用using来解释查询确实使用了我创建的索引,但是性能仍然不够好。
我想知道分片是否现在是要走的路..但我们很快将开始在该馆藏中每天增加约100万条新记录..所以我不确定它是否可以很好地扩展。
编辑:查询示例:
> 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,
        "scanAndOrder" : 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个值。
limit参数吗?