mongodb - 在 mongo 中搜索范围

标签 mongodb optimization database

当输入数据是单个值且集合数据包含最小/最大范围时,在 Mongo 中查找数据的最有效方法是什么?例如:

record = { min: number, max: number, payload }

需要为落在记录的最小/最大范围内的数字定位记录。范围从不相交。无法预测范围的大小。

该集合中有大约 600 万条记录。如果我解压范围(范围内的每个值都有记录),我会查看大约 4B 条记录。

我已经创建了 {min:1,max:1} 的复合索引,但尝试使用以下方式进行搜索:

db.block.find({min:{$lte:value},max:{$gte:value})

... 需要几秒到几十秒。以下是 explain()getIndexes() 的输出。我可以应用任何技巧来显着加快搜索执行速度吗?

NJmongo:PRIMARY> db.block.getIndexes()
[
    {
            "v" : 1,
            "key" : {
                    "_id" : 1
            },
            "ns" : "mispot.block",
            "name" : "_id_"
    },
    {
            "v" : 1,
            "key" : {
                    "min" : 1,
                    "max" : 1
            },
            "ns" : "mispot.block",
            "name" : "min_1_max_1"
    }
] 


NJmongo:PRIMARY> db.block.find({max:{$gte:1135194602},min:{$lte:1135194602}}).explain()
{
    "cursor" : "BtreeCursor min_1_max_1",
    "isMultiKey" : false,
    "n" : 1,
    "nscannedObjects" : 1,
    "nscanned" : 1199049,
    "nscannedObjectsAllPlans" : 1199050,
    "nscannedAllPlans" : 2398098,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 7534,
    "nChunkSkips" : 0,
    "millis" : 5060,
    "indexBounds" : {
            "min" : [
                    [
                            -1.7976931348623157e+308,
                            1135194602
                    ]
            ],
            "max" : [
                    [
                            1135194602,
                            1.7976931348623157e+308
                    ]
            ]
    },
    "server" : "ccc:27017"
}

最佳答案

如果您的 block 记录的范围从不重叠,那么您可以通过以下方式更快地完成此任务:

db.block.find({min:{$lte:value}}).sort({min:-1}).limit(1)

此查询几乎会立即返回,因为它可以通过在索引中进行简单查找来找到记录。

您正在运行的查询很慢,因为这两个子句分别匹配数百万条必须合并的记录。事实上,我认为你的查询会运行得更快(可能快得多),因为 minmax 上有单独的索引,因为你的化合物的 max 部分索引只能用于给定的 min -- 不能搜索具有特定 max 的文档。

关于mongodb - 在 mongo 中搜索范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16115464/

相关文章:

python - 如何在 PyMongo 中使用 sql "like"?

mongodb - Mongo 聚合 vs Java for 循环和性能

mongodb - 镜像生产 Mongo 数据用于分析

c++ - 将 double 写入 EEPROM

php - 使用 Azure 对 Codeigniter 部署进行故障排除

sql - 我可以从哪里开始基本的 sql 查询并成为这方面的专家?

javascript - 使用 Mongoose 的 promise 时遇到麻烦

javascript - 有没有办法查看哪些函数/执行花费的时间最长?

python - 如何运行 hyperopt 教程示例

使用 O_DIRECT 一致写入许多 block