MongoDB填充因子和更新优化

MongoDB的填充因子是为了应对文档扩展预留的空间,防止文档增长导致位置移动。文章探讨了两种优化方法:一是利用usePowerOf2Sizes属性预分配空间,适合频繁更新的集合;二是添加'垃圾'字段,如garbage,用于文档更新时的增长空间,减少文档重写。建议将可能增长的字段放在文档末尾以提高性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MongoDB填充因子(padding factor)是MongoDB为文档的扩展而预留的增长空间,因为MongoDB的文档是以顺序表的方式存储的,每个文档之间会非常紧凑。
MongoDB填充因子
如图,元素之间没有多余的可增长空间,当我们对顺序表中某个元素的大小进行增长的时候,就会导致原来分配的空间不足,放不回去原位了,只能要求其放于最后的位置。然后,后续插入的文档都会提供一定的填充因子,以便于文档频繁的修改,如果没有不再有文档因增大而移动的话,后续插入的文档的填充因子会依此减小。
两种方法来进行优化:
1. 如果文档的更新导致文档体积增长,如果增长的程度可以预知,那么可以为文档预留足够的增长空间,避免文档的位置移动,提高写入速度。在集合的属性中包含一个 usePowerOf2Sizes 属性,当这个选项为true时,系统会将后续插入的文档,初始空间都分配为2的幂数。
这种分配机制适用于一个数据会频繁变更的集合使用,他会给每个文档留有更大的空间,但因此空间的分配不会像原来那样高效,如果你的集合在更新时不会频繁的出现移动现象,这种分配方式会导致写入速度相对变慢。
2. 可以添加一个“垃圾”字段:
比如这样的文档:

{
    "_id":"ObjectId("XXX")",
    "bookname":"XXX",
    "tags":[]
}

书有子集的标签,但是初始时没有,以后会随着人们的添加越来越多,这样 tags 数组就会越来越大,对 tags 的大小如果有预估,比如不超过 100 字节,那么可以在每次插入新文档时,加入一个垃圾字段,字段名字可以随意,如:

{
    "_id":"ObjectId("XXX")",
    "bookname":"XXX",
    "tags":[],
    "garbage":".........................."+
        "........................ ......."+
        "........................ ......."
}

可以在第一次插入文档时这么做,也可以在 upsert 时使用 “

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值