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