首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >较慢的mongodb查询大型文档

较慢的mongodb查询大型文档
EN

Stack Overflow用户
提问于 2021-03-24 14:32:49
回答 1查看 32关注 0票数 1

我有一个只有2文档的mongodb数据库。两者都有相同的结构:

代码语言:javascript
复制
{ "general" { "name": "abc", "sid": "435435"},"resources":[{"id":1,"cnt":20}] "messages" : []}

小文档在消息中有0个对象,大1000。我数了两份文件中的标牌:小: 28000 : 450000。

我使用nodeJS与常规mongodb驱动程序一起访问文档,并将索引设置为"general.sid“。

现在我通过他们的general.sid请求文档。两份文件的时间都不一样!我收到文件,做一些计算和更新的文件general.resources。

在接收和更新文档之前和之后,我多次打印这个查询:

接收:小文档时间周期:1-2ms

接收:大文件时间周期:7-20 Big

写作:小文档时间周期:1-2ms

写作:大文档时间跨度:5-10 Big

接收功能的代码:

代码语言:javascript
复制
db.get().collection('player_data').find({"general.sid":UID}).limit(1).toArray(function (err, result){
  if(err){
    reject(null);
  }
  resolve(result);
});

为什么会有这么大的差异?

我不是mongodb或nodejs的专家,所以如果你需要其他数据,请告诉我!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-24 15:02:00

这种差异来自于您已经说过的,文档大小的差异。

索引查询首先扫描索引B树,一旦找到匹配,就开始获取文档,而索引扫描特定文档的时间可能会有所不同(取决于树的大小,以及文档所在的树中的位置)。在您的示例中,一个包含2个文档的集合和一个在none数组字段上的简单索引查询的索引扫描部分将是相同的。

这将引导我们进入find查询的下一部分,将匹配的文档读入内存,在这里,可以将更多的字节加载到内存中,这并不奇怪。查询将花费更多时间。对于write函数,很难给出确切的解释,因为很多人都不知道Mongo是如何更新文档的,但是我想如果更新一个字段而不是消息数组,那么差异也是可以忽略不计的。

如果您要求为db提供一个更好的“设计模式”,这完全取决于您日常的需要,但是为了解决当前的问题,我建议将messages保存在单独的集合中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66783251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档