Mongodb查询子集

时间:2011-12-07 17:03:56

标签: ruby mongodb nosql

我目前有一个MongoDB设置,它有一个相当大的数据库(大约250万个文档)。目前,我有一个拥有大部分数据的主集合,它具有单个索引(时间)。当只有时间位于查询的where部分(使用索引)时,这会产生可接受的查询时间。

问题是当我需要使用复合键时 - 时间索引使用大约2.5GB的内存,而我在服务器上只有4GB,所以我不想创建复合键索引,因为这会阻止所有索引都适合记忆,从而减慢了很多事情。

所以我的问题是:我可以先查询时间,然后查询其他变量的子集吗?

我应该指出我正在使用Ruby驱动程序。

目前,我的查询看起来像这样(这很慢):

trade_stop_loss_time = ticks.find_one({
        "time" => { "$gt" => trade_time_open, "$lte" => trade_time_close },
        "bid"  => { "$lte" => stop_loss_price } 
    }).sort({"time" => 1})

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您只是执行您提供的查询,那么数据库应该足够聪明,可以完全执行此操作。

您的查询应该基本上使用time索引过滤掉候选集,然后扫描bid参数的剩余对象。这应该比在客户端上进行扫描更有效率。

您绝对应该在查询中运行explain()以了解它正在做什么。如果它使用索引(BtreeCursor)并且扫描对象的数量只是给定时间范围内的项目数,那么它就可以了。考虑到你的限制,我认为没有比这更好的方法了。在客户端上执行相同的操作肯定会更慢。

当然,limit和较短的时间框架有助于提高查询速度,但这些可能是外部因素。 mongostat也可能有助于找到问题。

但是,如果您的文档和/或时间跨度很大,添加复合索引可能仍然会更好:从磁盘加载大量大型文档(因为您的RAM已满)需要一些时间。从磁盘分页索引也很慢,但数据要少得多。

一个好的答案只能是实验。

答案 1 :(得分:0)

您可以仅使用时间索引返回结果,然后在客户端进一步过滤它们?除此之外,我认为你几乎没有运气。