精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-01-28
在mongodb中有一个非常好用的collection : Capped Collections。 capped collection具有固定的大小,并且在auto-FIFO和age-out方面有很高的性能(具体怎么个高法得有数据支持,这里只讨论怎么做),age-out是基于插入顺序的。 capped collection自动维护插入顺序,在某些特殊的使用场景中非常有效,例如系统运行日志、监控数据(历史数据),在RDBMS中就需要做分区表,定期清理,而mongodb中只要设置好size或者max值则不需要考虑。 创建: 和标准collection不同,capped collection需要你显示地创建,定义collection的大小size,这里size的单位是byte,实际size是256byte的倍数。 > db.createCollection("mycoll", {capped:true, size:4000}) 这时已经创建完毕,我们可以使用下面的命令查看mycoll的状态 >db.mycoll.stats(); { “ns” : “mydb.mycoll″, “count” : 0, “size” : 0, “avgObjSize” : NaN, “storageSize” : 4096, “numExtents” : 1, “nindexes” : 0, “lastExtentSize” : 4096, “paddingFactor” : 1, “flags” : 0, “totalIndexSize” : 0, “indexSizes” : { }, “capped” : 1, “max” : 2147483647, “ok” : 1 } avgObjSize这个状态字,从字面意思可以看出是平均对象大小。 官网提示要注意: capped collection里的数据是不允许被删除的,所以只有collection的drop()函数被允许。 capped collection没有默认的_id索引,这点可以使用db.mycoll.getIndexes();来查看,显示结果为空[]。 当定义的大小空间使用完毕后,新添加的数据会替代collection中的旧数据(等下测试可以看到)。 当对capped collection使用find()方法的时候,它默认返回的数据是插入顺序,如果要反转顺序,则必须在find()方法后加上sort({$natural:-1})。 >db.mycoll.find().sort({$natural:-1}); 下面就来测试数据替换: >for(i=1;i<=150;i++) {db.mycoll.insert({x:i})} 上面的语句我们循环向mycoll集合中插入了150条数据,以i来标识我们的数据,下面就使用find方法来查看我们已经插入的数据 >db.mycoll.find(); //我就不复制了,命令行复制比较麻烦 这里的数据是从78开始的 然后使用 >db.mycoll.stats(); 可以看到只插入了73个数据,而平均对象大小是36,size是2628,但是我们的storageSize是4096,这个原因官网的一句话可以解释。 Note that the size specified includes database headers 从上面数据从78开始就可以看出确实数据是被替换了 如果我们使用db.mycoll.find().sort({$natural:-1})这条语句,则可以发现第一条记录是150。
选项 size 这是capped collection必须被定义的部分。 max 还可以定义collection中允许存储的最大对象数目,可以用validate()方法查看使用了的空间,从而估算所需的大小。。 db.createCollection("mycoll", {capped:true, size:100000, max:100}); db.mycoll.validate();
查看集合是否是capped collection
db.mycoll.isCapped(); 将一个集合转换为capped collection > db.runCommand({"convertToCapped": "mycoll", size: 100000}); 一个小知识:当我们在函数后不加()时,例如db.mycoll.isCapped,这样是用于查看isCapped函数的定义
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 2915 次