我们最近的一个主要集合已经达到了200万条记录,现在我们开始在该集合上遇到严重的性能问题。
该集合中的文档有大约8个字段,您可以使用UI进行筛选,并且结果应该按照记录处理时的时间戳字段进行排序。
我已经添加了几个包含筛选字段和时间戳的复合索引,例如:
db.events.ensureIndex({somefield: 1, timestamp:-1})
我还添加了一些索引,以便同时使用多个过滤器来实现更好的性能。但有些过滤器仍然需要很长时间才能执行。
我确保使用explain命令查询时,可以看到我创建的索引被使用,但性能仍然不够好。
我在考虑是否采用分片的方式,但是我们将很快开始每天在该集合中新增约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
参数吗? - Joe