如果你查一下MongoDB 中Collection的stats,那么你会发现一个叫paddingFactor的统计数据,本文我们就来为大家讲述这个数据的意义。
> db.no_padding.stats() { … “paddingFactor” : 1.4099999999940787, … } |
实验代码
从名称上我们可以猜到,这个参数应该与文档后面填充的空白空间有关,那么这个参数是从何而来,又是如何影响我们的存储的呢?下面先看一个例子,将下面代码保存为文件/tmp/script.js
var d = db.getSisterDB(“padding_test”); d.no_padding.drop(); d.padding.drop(); var no_padding_f = function(count) { var start = Date.now(); for (var i=0; i < count; i++) { // Document created with only the _id field d.no_padding.insert({_id:i});//注意,这里没有设置counter1,counter2,counter3三个值 d.no_padding.update({_id:i}, {$inc : {“counter1”: 1}}, true); d.no_padding.update({_id:i}, {$inc : {“counter2”: 1}}, true); d.no_padding.update({_id:i}, {$inc : {“counter3”: 1}}, true); } t = (Date.now() – start)/1000; print(“no_padding_f runtime: ” + t); return t; } var padding_f = function(count) { var start = Date.now(); for (var i=0; i < count; i++) { // Document created with all the counter fields I // expect to use, each initialized to 0. d.padding.insert({_id:i, counter1: 0, counter2: 0, counter3: 0});//设置了三个值 d.padding.update({_id:i}, {$inc : {“counter1”: 1}}, true); d.padding.update({_id:i}, {$inc : {“counter2”: 1}}, true); d.padding.update({_id:i}, {$inc : {“counter3”: 1}}, true); } t = (Date.now() – start)/1000; print(“padding_f runtime: ” + t); return t; } var t1 = no_padding_f(200000); var t2 = padding_f(200000); var faster = (1-(t2/t1))*100; print(“Padded is ” + faster + “% fastern”); print(“storageSize with no padding : ” + d.no_padding.stats().storageSize); print(“paddingFactor with no padding: ” + d.no_padding.stats().paddingFactor); print(“storageSize with padding : ” + d.padding.stats().storageSize); print(“paddingFactor with padding : ” + d.padding.stats().paddingFactor); |
结果
然后使用MongoDB执行这个脚本,得到如下结果:
{nehresma@frodo:/tmp/mongodb-linux-x86_64-1.7.3/bin}$ ./mongo –quiet /tmp/script.js
no_padding_f runtime: 56.031
padding_f runtime: 42.165
Padded is 24.747015045242815% faster
storageSize with no padding : 27136256
paddingFactor with no padding: 1.4099999999940787
storageSize with padding : 17614336
paddingFactor with padding : 1
从代码中我们能看到,这两个Collection现在的数据是一样的,但是上面红色数字确显示,no padding这个Collection的大小(storageSize)比padding这个Collection的大小大很多。而同样我们上面说到的paddingFactor系统也分别是1.4和1。
原理解释
实际上是由于上面不同的数据操作方式影响到了paddingFactor参数。而paddingFactor参数又会影响到文档中的空白空间填充量,从而影响了storageSize。
下面我们解释一下具体过程:
当我们在不预先设定字段的情况下对字段做incr操作,会导致Document的体积变大,在MongoDB中,如果一个Update操作使Document体积变大,如果大到Document目前的总空间无法装下,就需要对Document进行移动,而MongoDB内部有一种类似于机器学习的机制,当其发现一个Collection中的Document老是以一定比例膨胀,它就会在创建新Document的时候预留出一定比例的空白空间,以防止Update后需要移动数据的情况。因为移动数据可能会是一个非常耗时的操作。(移动数据位置首先需要进行数据文件的改写,然后还要对索引中存储的数据位置进行改写,所以是非常麻烦的。)
关于paddingFactor之其它
关于paddingFactor,这里再列出几个知识点:
1.paddingFactor值是一个机器学习的结果,当你用了–repair方法对数据库进行了修复后,这个值会恢复到1
2.数据位置移动是一个需要尽量避免的过程,如果是小数据量,可能数据移动前后的文件都在map到内存中了,而如果数据量过大,可能就会涉及到磁盘IO操作了
3.需要注意的一点是,即使你预先设定了值再进行incr等数字操作,如果数字从32字节的int增长到64字节的int,还是会导致数据膨胀的。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
作者
相关推荐
-
MongoDB与Cassandra数据库对比
MongoDB和Cassandra都属于NoSQL数据库系列,它们也恰好都是开源,但是,它们的相似之处仅此而已 […]
-
eHarmony公司利用Redis NoSQL数据库进行热存储
虽然关系型数据库不会消失,但关系型数据库管理系统有时仅在会话管理、推荐引擎和模式匹配等关键Web应用程序中担当 […]
-
2017年1月数据库流行度排行榜 新年新气象
新年新气象,数据库知识网站DB-engines最近更新了2017年1月份数据库流行度榜单。TechTarget数据库网站将与您分享1月份的榜单排名情况,让我们拭目以待。
-
2016年12月数据库流行度排行榜 几家欢乐几家愁
在过去的6个月中,数据库排行榜的前二十名总体上没有太大的变动,那么数据库知识网站DB-engines最近更新的2016年12月份数据库流行度排名情况是否一如既往的沉寂、低调呢?