关于 paddingFactor 一直感觉很玄乎。不知道这个值到底是什么单位,比如显示1 或 1.4 。
> db.test.stats()
{
"ns" : "test.test",
"count" : 6,
"size" : 272,
"avgObjSize" : 45.333333333333336,
"storageSize" : 4096,
"numExtents" : 1,
"nindexes" : 1,
"lastExtentSize" : 4096,
"paddingFactor" : 1,
"systemFlags" : 0,
"userFlags" : 0,
"totalIndexSize" : 8176,
"indexSizes" : {
"_id_" : 8176
},
"ok" : 1
}
>
而同事也一直纠结的问,一个字段修改后,多长才会被移到表后面啊。
我也说不出一个所以然来。
在查找资料时,看到有关于表(集合)的一个配置,设置COLLMOD的值:
http://docs.mongodb.org/manual/reference/command/collMod/
db.runCommand( {collMod: "products", usePowerOf2Sizes : true })
You can calculate the padding size by subtracting the document size fromthe record size or, in terms of the paddingFactor, by subtracting1 from the paddingFactor:
padding size = (paddingFactor - 1) * <document size>.
For example, a paddingFactor of 1.0 specifies a padding size of0 whereas a paddingFactor of 1.2 specifies a padding size of0.2 or 20 percent (20%) of the document size.
With the following command, you can use the paddingFactor option ofthe compact command to set the record size to 1.1 ofthe document size, or a padding factor of 10 percent (10%):
db.runCommand ( { compact: '<collection>', paddingFactor: 1.1 } )
从官方的说明文档来看,这个值还真是 % ,当然也可以自己修改。
还有下面的转载内容,把这个说明得也很清楚。直接出答案:
collmod 选项:
第一种padding方式,Mongodb会计算一个_paddingFactor,开辟
padding size = (paddingFactor - 1) * <document size>.
大小,以防止update引起的长度变大,需要移动数据。第二种方式usePowerOf2Size,Mongodb为文档开辟的空间总是2的倍数,如之前我们说过的,文档大小68字节,那么就会开辟128字节,bucket函数就是从bucketSize数组中寻找最接近文档长度的那个2的次方值。
这两种方式各有优劣,padding方式会为文档开辟更合适的大小,而且paddingFactor比较小,一般为0.01-0.09,不会浪费空间,文档更新小的话也不会移动文档位置。但是当大量更新和删除的时候,这种方式重复利用空间的能力就比较小,因为在deleteList中,不太容易找到合适的已删除文档,而且一旦更新就会又移动位置,磁盘重复利用率低,增长快,碎片多。相比之下,usePowerOf2Size方式,Mongodb每次都会开辟比文档大的多的空间,使用空间变多,但是更新和删除的容错率就会比较高,因为在deleteList列表中更容易找到合适的删除文档(每个列表中的文档大小都是相同的固定的),更新的时候也不会大量移动位置,磁盘重复利用率高,增长慢。
来源:
Mongodb如何重复利用空间和usePowerOf2Size标识
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=15795819&id=3554717