【发布时间】:2013-11-02 18:36:13
【问题描述】:
我们最近为我们的一个主要系列创造了超过 200 万个记录,现在我们开始为该系列的主要性能问题而苦恼。
集合中的文档有大约 8 个字段,您可以使用 UI 过滤这些字段,并且结果应该按处理记录的时间戳字段排序。
我添加了几个带有过滤字段和时间戳的复合索引 例如:
db.events.ensureIndex({somefield: 1, timestamp:-1})
我还添加了几个索引,以便一次使用多个过滤器,以期获得更好的性能。但是有些过滤器仍然需要很长时间才能执行。
我已确保使用说明查询确实使用了我创建的索引,但性能仍然不够好。
我想知道分片是不是现在要走的路.. 但我们很快就会开始在该集合中每天有大约 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参数吗? -
不错的一个!将来我可能会遇到类似的情况,答案也可能对我有帮助。你的数据库有多大的集合?在达到 200 万之前查询这 8 个 KV 对需要多长时间?现在需要多长时间? (只是好奇)
-
乔,是的,当然我正在使用限制,目前我将结果限制为 25 个文档。我什至不想谈论跳过,因为我将在不久的将来用范围查询替换它们。
-
Enver,当收集大约 1-2 百万条记录时,我开始感觉到一些性能问题(5-50 秒的查询时间)。然后我添加了索引,我得到了合理的查询性能
-
哪些查询很慢?没有过滤的简单查询已经很慢了吗?还是只有一个字段过滤的查询很慢?还是按两个字段?