mysql - MongoDB 高存储大小

标签 mysql mongodb database-design database nosql

我刚刚从 mysql 切换到 mongoDB,它非常棒,但我在数据库数据大小方面遇到了困难。

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

平均对象大小约为 53k(这仅需要几个小时),因此通过简单的数学计算,它应该是 53*700 = 37MB。但总大小约为250MB(storageSize)(只有2h!)

所以,我每天都会创建超过 1GB 的数据,在 mysql 中约为 100mb/天(甚至更少)。

这正常吗?我该如何处理?谢谢!

enter image description here

最佳答案

您看到这种情况的原因是记录对象的碎片。

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

记录对象是单个连续的硬盘空间,从而限制硬盘查找的次数并使其具有顺序性。不过,这种硬盘查找有一个令人讨厌的缺点,如果您的文档不断增长,那么它们必须不断地移动到越来越大的记录对象,将旧的记录对象发送到 $freelists(空闲空间的内部列表)由进来的另一个相同大小的对象使用。

这会产生碎片,我相信这就是您在自己的数据中看到的情况。

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

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

目前解决此问题的最佳方法是更改​​架构,将评论提取到自己的集合中。

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

关于mysql - MongoDB 高存储大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20476032/

相关文章:

node.js - 如何在mongoose中实现mysql的left join之类的功能

api - REST API/数据模型设计 - 用户、帐户或两种模型?

Mysql SUM 两次并返回总持续时间为天、小时、分钟

python - 如何将python Flask中的变量传递给mysqldb?

Mongodb 打印多个字段中唯一值的计数

node.js - GridFS 中的自定义字段

mysql - 匹配系统

mysql - Mysql+Nodejs如何回调结果

mysql - 在具有年度数据行的表中存储年份字段的列类型

mysql - 在数据库内部显式设置关系有什么好处