0

与 MongoChef 一起玩时,我发现查询随着时间和集合中文档数量的增加而变慢。EX:我去年 11 月启动了一个应用程序,从那时起我将数据保存到同一个集合中的 mongo DB 中,没有过期日期。

现在我执行这个查询:

{ "mongoTime": { $gte: "2015-09-01T15:46:51+0200" }, $and: [ { "mongoTime": { $lt: "2015-11-01T15:46:51+0200" } } ] }

它在 0.178 秒内检索239 691 个文档,持续 2 个月。

但:

{ "mongoTime": { $gte: "2016-01-27T00:00:00+0000" }, $and: [ { "mongoTime": { $lt: "2016-01-29T11:38:42+0000" } } ] }

在 6.391 秒内检索199 909 个文档,持续 3 天。

区别:第一个查询获取第一个插入 Mongo 的所有文档,第二个查询获取最近 3 天到现在的所有文档。

当然 Collection 已经有数百万个文件,我想阅读一些关于如何处理这个问题的建议。我考虑过使用索引:类似于:

db.clicks.createIndex( { "mongoTime": 1 } ) 

或者

db.clicks.createIndex( { "mongoTime": -1 } )

但是更新这个集合的索引需要一段时间,最好在出错之前询问,索引也会影响写入性能。

提前致谢。

阅读正确答案并应用索引后:

{ "mongoTime": { $gte: "2016-01-27T00:00:00+0000" }, $and: [ { "mongoTime": { $lt: "2016-01-29T11:38:42+0000" } } ] }

在 0.194 秒内检索199 909 个文档,持续 3 天。

大的进步。谢谢...

4

1 回答 1

2
db.clicks.createIndex( { "mongoTime": 1 } ) 

是的,该索引将显着提高您提供的查询的性能。MongoDB 将能够更有效地检查您的查询的过滤条件——而不是遍历集合中的每个文档,它将遍历B-tree索引,从而大大减少了它必须访问的节点数量。

顺便说一句,你没有$and正确使用。这是正确的方法:

{ $and: [
    { "mongoTime": { $gte: "2016-01-27T00:00:00+0000" } },
    { "mongoTime": { $lt: "2016-01-29T11:38:42+0000" } }
] }
于 2016-01-29T13:04:09.560 回答