2011-12-07 77 views
0

我目前有一个相当大的数据库(约250米文件)的MongoDB设置。目前,我有一个主要集合,其中大部分数据都具有单一索引(时间)。只有时间位于查询的where部分(使用索引)时,这会导致可接受的查询时间。MongoDB查询子集

问题是当我需要使用复合键 - 时间索引使用大约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}) 

谢谢!

回答

1

如果您只是简单地执行您提交的查询,那么数据库应该足够聪明,可以做到这一点。

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

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

当然,一个limit和一个小的时间框架将有助于使您的查询更快,但这可能是外部因素。 mongostat也可能有助于发现问题。但是,如果您的文档和/或时间跨度很大,添加复合索引可能会更好:从磁盘加载大量大文档(因为您的RAM已满)需要一些时间。从磁盘分页索引也很慢,但数据少得多。

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

0

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