我刚刚从mysql切换到使用mongoDB,它非常棒,但我正在努力使用db datasize ..
我每天大约有700个文档,每个文档内嵌有大约900条评论。
平均对象大小约为53k(这只是几个小时),因此简单的数学应该是53 * 700 = 37MB。但总大小约为250MB(storageSize)(仅2h!)
所以,我每天会创建超过1GB的数据,在mysql中大约是100mb /天(甚至更少)。
这是正常的吗?我怎么处理它?谢谢!
答案 0 :(得分:1)
您之所以看到这一点,是因为记录对象存在碎片。
MongoDB中的每个文档都保存在一个内部记录对象中,将其视为代表文档的C ++结构。
记录对象是单个连续的硬盘空间,以便限制硬盘查找次数并使其顺序。这个硬盘查找有一个讨厌的方面,如果不断增长你的文件然后他们必须不断移动到越来越大的记录对象,将旧的记录对象发送到$freelists
(免费的内部列表空格)由另一个大小的对象使用。
这会产生碎片,我相信这就是您用自己的数据所看到的。
解决此问题的一种方法通常是使用powerof2sizes
(http://docs.mongodb.org/manual/reference/command/collMod/),遗憾的是由于文档的增加方式,我认为这不会起作用。
解决此问题的另一种方法是手动设置填充,以便文档始终适合并且永远不会移动但是您还不能:https://jira.mongodb.org/browse/SERVER-1810
目前,解决此问题的最佳方法是更改架构,将注释分解为自己的集合。
这确实意味着两个查询,但它们应该是两个索引超快速查询,可能比从磁盘加载该文档慢几毫秒。
答案 1 :(得分:0)
无法计划更改架构,请访问http://docs.mongodb.org/ecosystem/use-cases/pre-aggregated-reports以避免数据增长和碎片问题。
答案 2 :(得分:0)
我在任何当前答案中都没有看到的一件事是初始插入时的文档填充。您可以通过在文档中填充一些额外空格来填充文档(在某种程度上)来避免数据增长,以适应将来添加的注释。
http://docs.mongodb.org/manual/faq/developers/#faq-developers-manual-padding
使用您已有的关于平均文档大小的数据,添加一点,并在初始插入时添加一些填充。它应该可以提高您的更新性能,并避免上述评论者讨论的瑞士奶酪效应。
作为参考,这就是为什么你会看到这么多额外的空间: