我目前有一个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})
谢谢!
答案 0 :(得分:1)
如果您只是执行您提供的查询,那么数据库应该足够聪明,可以完全执行此操作。
您的查询应该基本上使用time
索引过滤掉候选集,然后扫描bid
参数的剩余对象。这应该比在客户端上进行扫描更有效率。
您绝对应该在查询中运行explain()
以了解它正在做什么。如果它使用索引(BtreeCursor
)并且扫描对象的数量只是给定时间范围内的项目数,那么它就可以了。考虑到你的限制,我认为没有比这更好的方法了。在客户端上执行相同的操作肯定会更慢。
当然,limit
和较短的时间框架有助于提高查询速度,但这些可能是外部因素。 mongostat
也可能有助于找到问题。
但是,如果您的文档和/或时间跨度很大,添加复合索引可能仍然会更好:从磁盘加载大量大型文档(因为您的RAM已满)需要一些时间。从磁盘分页索引也很慢,但数据要少得多。
一个好的答案只能是实验。
答案 1 :(得分:0)
您可以仅使用时间索引返回结果,然后在客户端进一步过滤它们?除此之外,我认为你几乎没有运气。