当前位置: 首页 > 知识库问答 >
问题:

较慢的mongodb查询大型文档

宿景曜
2023-03-14

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

{ "general" { "name": "abc", "sid": "435435"},"resources":[{"id":1,"cnt":20}] "messages" : []}

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

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

现在我要他们的将军提供文件。而且这两个文档的时间差别很大!我接收文档,进行一些计算并更新文档。

我打印接收和更新文档之前和之后的时间我做了几次这个查询:

接收:小文档时长:1-2ms

接收:大文件时间跨度:7-20ms

书写:小文档时长:1-2ms

书写:大文档时间跨度:5-10ms

接收函数代码:

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

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

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

共有1个答案

韩佐
2023-03-14

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

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

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

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

 类似资料:
  • 所以我对大约500k文档有以下查询,它在数据库端非常慢: 我知道allowDiskUse使它变慢,但如果禁用它,我会得到: MongoError:超过$group的内存限制,但不允许外部排序。通过允许磁盘使用:真来选择加入。

  • 我试图在mongodb日志文件中只记录慢速查询(执行时间超过10秒)。 我在运行蒙戈作为 并将分析设置为 但是当跟踪日志文件时,它会打印所有的查询。我可以看到很多查询,它的运行时间为0ms。我还需要添加什么来只获得慢速查询吗?

  • 主要内容:find() 方法,pretty() 方法,findOne() 方法,条件查询,AND条件语句,OR 条件语句,AND 和 OR 联合使用前面我们介绍了怎么将文档插入到集合中,本节我们来介绍一下如何从集合中查询指定的文档。 find() 方法 想要查询集合中的文档,可以使用 MongoDB 中的 find() 方法,find() 方法可以将查询结果以非结构化的方式展示出来,其语法格式如下: db.collection_name.find(query, projection) 语法说明如

  • 我有一个名为“Prices”的MongoDB集合,我试图查询“startDate”和“endDate”之间的价格。 该集合每10秒存储一次价格,但是当查询此集合以绘制图形时,每1-2分钟的价格才是真正重要的。 我尝试用两种不同的方式编写此查询: 方法1:使用{$gte:startDate,$lte:endDate} 此方法引发以下错误: 如果删除排序('-timestamp')行,并再次运行此查询

  • 问题内容: 我正在尝试使用将大文件(> 1 GB)从硬盘复制到USB驱动器。一个描述我正在尝试做的简单脚本是: 在Linux上只需要2-3分钟。但是在Windows下,同一文件上的同一文件副本要花费10-15分钟以上的时间。有人可以解释为什么并给出一些解决方案,最好使用python代码吗? 更新1 将文件另存为test.pySource文件大小为1 GB。目的地目录位于USB驱动器中。使用ptim

  • 本文向大家介绍索引大型文本字段以使MongoDB中的查询更快,包括了索引大型文本字段以使MongoDB中的查询更快的使用技巧和注意事项,需要的朋友参考一下 要为大文本字段建立索引,请与$regex一起使用以进行文本搜索。让我们创建一个包含文档的集合- 在方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是索引大文本字段以使查询更快的查询- 这将产生以下输出-