【问题标题】:Mongo db query subsetMongodb 查询子集
【发布时间】:2017-07-09 07:37:23
【问题描述】:

我目前有一个带有相当大数据库(大约 250m 文档)的 MongoDB 设置。目前,我有一个包含大部分数据的主要集合,它有一个索引(时间)。当只有时间在查询的 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})

谢谢!

【问题讨论】:

    标签: ruby mongodb nosql


    【解决方案1】:

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

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

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

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

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

    只有通过实验才能给出好的答案。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-08-26
        • 1970-01-01
        • 2017-09-15
        • 2019-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-15
        • 2018-11-16
        相关资源
        最近更新 更多