MongoDB的数据架构的性能(MongoDB data schema performance)

2019-07-31 07:59发布

我想了解数组和哈希MongoDB中的文件(其中,从我的理解是通过数组实现)的内部分配和安置。

在我们的领域,我们有5-6之间成千上万和成千上万个键值对的任何地方逻辑分组多达水平深处(认为嵌套的哈希值)的文档。

我们代表的按键嵌套有一个点,例如, xyz ,其中在插入的MongoDB会自动变成是这样的:

{
    "_id" : "whatever",
    "x" : {
        "y" : {
            "z" : 5
        }
    }
}

最常见的操作是增加值,这是我们做的一个原子$inc在同一个更新命令时,通常1000+值。 新的密钥会陆续加入,但不经常,说,100次/天。

它发生在我的另一种表示将在名字,但一些其他的分隔符不使用点和创建平面文件,例如,

{
    "_id" : "whatever",
    "x-y-z" : 5
}

鉴于键值对的使用模式来讲数量和$inc更新和新钥匙插入,我在以下方面寻找的两种方法之间的权衡指导:

  • 磁盘空间开销

  • 性能$inc更新

  • 新的键将插入性能

Answer 1:

在磁盘上存储的MongoDB中的文件是在BSON格式。 还有这里的BSON格式的详细说明: - http://bsonspec.org/#/specification

虽然有使用快捷键的名称一些节省磁盘空间(因为,你可以通过查看规格看,该键值名称嵌入到文档中),它看起来对我来说,那里会是两者之间几乎没有净差在使用的磁盘空间方面的设计 - 您使用额外的字节通过使用分隔符( - ),因为不必有串终结了单独的密钥值获得买了回来。

$ INC更新应该采取几乎相同的时间与这两种格式,因为他们既要在内存中的操作。 在内存中更新时间的任何调整都将是舍入误差相比,读取文档关盘所花费的时间的最小的。

新的密钥插入性能也应该是几乎相同。 如果添加新的键/值对叶新文件足够小,适合在磁盘上的老位置,那么所发生的一切是在内存中的版本更新和日记条目被写入。 最终,在内存中的版本将被写入到磁盘中。

如果文档增长超过以前分配给它的空间,新的密钥插入更多的问题。 在这种情况下,服务器必须将文件移动到新位置,并更新指向该文件的所有索引。 这通常是一个缓慢的操作,并且应该避免。然而,模式改变了,你在讨论不应该影响文档运动的频率。 同样,我认为这是一个洗。

我的建议是使用最适合于开发人员的生产力模式。 如果您遇到性能问题,那么你可以问你怎么可以扩展系统或提高性能,或两者不同的问题。



文章来源: MongoDB data schema performance