Mongo 查询性能

Mongo Query Performance

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

现在我执行这个查询:

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

它在 2 个月 时间段内在 0.178 秒内检索 239 691 份文件。

但是:

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

正在检索 199 909 篇文档,时间为 6.391 秒,持续 3 天

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

当然,该集合已经有数百万个文档,我想阅读一些有关如何处理此问题的建议。我考虑过使用索引:像这样的东西:

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" } } ] }

正在检索 199 909 篇文档,时间为 0.194 秒,持续 3 天

大进步。谢谢...

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" } }
] }