为啥MongoDB会占用这么多空间?

Posted

技术标签:

【中文标题】为啥MongoDB会占用这么多空间?【英文标题】:Why does MongoDB takes up so much space?为什么MongoDB会占用这么多空间? 【发布时间】:2013-12-03 23:17:52 【问题描述】:

我正在尝试在 mongoDB 中存储具有一组双精度和整数(大约 15-20)的记录。大部分记录(99.99%)具有相同的结构。

当我以root(一种非常结构化的数据存储格式)存储数据时,对于 2250 万 条记录,该文件大约为 2.5GB。然而,对于 Mongo,数据库大小(来自命令 show dbs)约为 21GB,而数据大小(来自 db.collection.stats())约为 13GB

这是一个巨大的开销(澄清:13GB 与 2.5GB,我什至不是在谈论 21GB),我猜这是因为它同时存储了 keysvalues .所以问题是,为什么以及如何 Mongo 在缩小它方面做得更好?

但主要问题是,这对性能有何影响?我有 4 个索引,它们的大小为 3GB,因此如果我将数据量翻倍并尝试在内存中保留大量工作集,则在单个 8GB 机器上运行服务器可能会成为问题。

我是否应该使用 SQL 或其他数据库有任何猜测吗?或者如果有人尝试过,就继续使用 ROOT 文件?

【问题讨论】:

这个问题可能意味着不同的事情,具体取决于您的情况。 1. 如果您是 Mongo 的新手,您需要的答案很可能是 lix 未接受的答案。 2.实际问题是关于压缩的。因此,如果您使用的是旧的 mongo,或者不知何故没有压缩,请查看 Mongo 压缩引擎。 【参考方案1】:

基本上,这是 mongo 为插入数据做准备。 Mongo 为数据执行预分配存储以防止(或最小化)磁盘上的碎片。这种预分配以mongod 实例创建的文件的形式出现。

首先它会创建一个 64MB 的文件,然后是 128MB,然后是 512MB,然后不断地创建,直到达到 2GB 的文件(预分配数据文件的最大大小)。

mongo 还做了一些可能会使用更多磁盘空间的事情,比如journaling...

有关 mongoDB 如何使用存储空间的更多信息,您可以查看this page,特别是标题为Why are the files in my data directory larger than the data in my database?的部分

您可以采取一些措施来最大程度地减少使用的空间,但这些技术(例如使用--smallfiles option)通常只推荐用于开发和测试用途,而不是用于生产。

【讨论】:

+1,因为这是一个值得称赞的详尽解释,@xcorat 并未将其标记为已接受的答案。 感谢您的回答,但它没有具体回答问题。这种开销不是由于预分配或日志记录,而是数据的存储方式!我提到数据大小约为 13GB,仍然是根文件的 6 倍! 新的 mongoDB 版本内置了压缩引擎,在压缩类似数据方面做得非常好。因此,请考虑此问题的主要部分仅与以前的版本相关。【参考方案2】:

问题:您应该使用 SQL 还是 MongoDB?

答案:视情况而定。

更好的提问方式:您应该使用关系数据库还是文档数据库?

回答

如果您的数据是高度结构化的(每一行都有相同的字段),或者您严重依赖外键并且您需要在使用这些相关记录的操作上具有强大的事务完整性...请使用关系数据库。 如果您的记录是异构的(每个文档有不同的字段)或具有可变长度字段(数组)或具有嵌入式文档(分层)...请使用文档数据库。

我当前的软件项目同时使用两者。为工作使用正确的工具!

【讨论】:

以上是关于为啥MongoDB会占用这么多空间?的主要内容,如果未能解决你的问题,请参考以下文章

为啥导出到可运行的 jar 会使应用占用这么多空间?

为啥我的 MongoDB 聚合查询这么慢

MongoDB如何释放空闲空间?

mongodb 磁盘空间啥时候释放

为啥 iOS 设备上的 glGenerateMipmap() 会占用这么多客户端内存?

为啥训练我的朴素贝叶斯分类器会占用这么多内存?