【问题标题】:Slower mongodb queries for big documents对大文档的较慢的 mongodb 查询
【发布时间】:2021-03-24 14:32:49
【问题描述】:

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

{ "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-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 的专家,所以如果您需要任何其他数据,请告诉我!

【问题讨论】:

    标签: node.js mongodb performance


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 是的,我认为将它移动到另一个集合会节省一些时间,因为这些消息并不总是需要的。谢谢你,祝你有美好的一天! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2016-01-11
    • 2015-02-22
    • 1970-01-01
    相关资源
    最近更新 更多