在对具有二进制数据的文档进行ID迭代时,查询速度慢

时间:2017-07-25 12:14:54

标签: mongodb

我们需要迭代特定集合中所有文档的ID,这些文档包含二进制数据字段。

当我们使用仅返回_id字段的投影查询时,查询大约需要80秒才能返回200000个结果。

是否有更快的方法来获取仅包含_id字段的游标,并且不会因二进制数据字段的大小而降级? 如果我们从所有文档中删除数据字段,则查询将在几百毫秒内返回。

在mongo shell中重现的步骤:

function randomString() { 
    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz"; 
    var randomstring = ''; 
    var string_length = 64000;
    for (var i=0; i<string_length; i++) { 
        var rnum = Math.floor(Math.random() * chars.length); 
        randomstring += chars.substring(rnum,rnum+1); 
    } 
    return randomstring; 
}

var data = randomString()
for (var i = 1; i <= 200000; i++) { db.testData.insert({data: new BinData(0, data)}) }

var cursor = db.testData.find({}, {_id: true})
cursor.forEach(printjson)

2 个答案:

答案 0 :(得分:1)

我们发现长查询时间是由于索引的排序顺序可能不同,导致mongodb在运行查询时需要访问文档,即使索引覆盖了查询。

因为_id上的索引按升序排序,所以只需对find进行排序就会在100毫秒内返回结果:

var cursor = db.testData.find({}, {_id: true}).sort({_id: 1})

答案 1 :(得分:0)

在我的情况下花费那么长的时间似乎是正常的...... 75000毫秒。

为什么必须遍历_id?你在找什么?也许您可以添加时间戳或使用集成在id中的时间戳。然后,您可以限制选择或指定查找顺序。

PS。:如果查找不够,聚合订单有更多选项。