首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB高storageSize

MongoDB高storageSize
EN

Stack Overflow用户
提问于 2013-12-09 16:51:32
回答 3查看 113关注 0票数 0

我刚从mysql转到使用mongoDB,它非常棒,但我正在与db数据作斗争。

我每天大约有700个文档,每个文档中都有大约900个评论嵌入。

对象的平均大小大约是53k (这只需要几个小时),所以对于简单的数学来说,应该是53*700 =37 so。但总尺寸约为250 2h (storageSize) (仅2h!)

因此,我将每天创建超过1GB的数据,在mysql中,每天大约100 in (甚至更少)。

这正常吗?我该怎么处理呢?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-10 11:27:41

您之所以看到这一点,是因为记录对象的碎片。

MongoDB中的每个文档都保存在内部记录对象中,将其视为表示文档的C++结构。

记录对象是单个连续的硬盘空间,从而限制了硬盘查找的数量并使其连续。但是,硬盘查找有一个不好的缺点,如果您的文档不断增长,那么它们必须不断地移动到越来越大的记录对象,将旧的记录对象发送到$freelists (一个空闲空间的内部列表),以供另一个相应大小的对象使用。

这会造成碎片化,我相信这就是你用自己的数据看到的。

通常解决这一问题的一种方法是使用powerof2sizes ( http://docs.mongodb.org/manual/reference/command/collMod/ ),不幸的是,由于您的文档增加的方式,我认为这是行不通的。

解决这一问题的另一种方法是手动设置填充,以便文档始终适合并且永远不会移动,但是您还不能:https://jira.mongodb.org/browse/SERVER-1810

目前,解决此问题的最佳方法是更改模式,将注释分解到它们自己的集合中。

这确实意味着两个查询,但它们应该是两个索引超快的查询,可能比从磁盘加载文档慢几微秒。

票数 1
EN

Stack Overflow用户

发布于 2013-12-09 20:36:33

在计划更改模式的情况下,请访问http://docs.mongodb.org/ecosystem/use-cases/pre-aggregated-reports以避免数据增长和碎片问题。

票数 0
EN

Stack Overflow用户

发布于 2013-12-10 04:51:22

在当前的任何一个答案中,有一件事我还没有看到,那就是初始插入的文档填充。您可以避免数据增长(在某种程度上),方法是在开始时将文档“填充”一些额外的空间,以适应将来将添加的注释。

http://docs.mongodb.org/manual/faq/developers/#faq-developers-manual-padding

使用手头已有的关于平均文档大小的数据,在初始插入中添加一点,包括填充。它应该提高您的更新性能,并避免瑞士奶酪效应,上面的评论者正在谈论。

作为参考,这就是你看到这么多额外空间的原因:

http://docs.mongodb.org/manual/core/record-padding/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20476032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档