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

时间:2013-11-20 05:11:55

标签: mongodb large-data database

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

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

这是一个巨大的开销( Clarify:13GB vs 2.5GB,我甚至不谈21GB ),我想这是因为它同时存储了keys和{ {1}}。所以问题是,为什么以及 Mongo 如何做得更小呢?

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

我是否应该使用SQL或其他数据库?或者如果有人尝试过,可能只是继续使用ROOT文件?

2 个答案:

答案 0 :(得分:26)

基本上,这是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 :(得分:2)

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

答案:视情况而定。

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

答案

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

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