当数据无法适应内存时,mongoDB与关系数据库相比?

时间:2011-06-26 18:30:56

标签: mongodb database-design database nosql

首先,我为我对NoSQL架构(以及一般数据库)的潜在浅薄理解深表歉意,所以请耐心等待。

我正在考虑使用mongoDB来存储与UUID相关的资源。资源可以是诸如大图像文件(几十兆字节)之类的东西,因此将它们存储为文件并仅在我的数据库中存储链接以及相关元数据是有意义的。还可以灵活地解耦资源文件的实际位置,因此如果需要,我可以使用不同的第三方来存储文件。

现在,一篇描述资源的文档大约是1kB。起初我除了几十万个数据库大小相当于几百兆字节的资源文档,很容易适应服务器内存。但在将来,我可能需要将其扩展到数十个百万个文档的数量级。这将是几十千兆字节,我不能再挤进服务器内存了。

只有索引仍然适合大约一千兆字节或两千兆字节的内存。但是,如果我理解正确,每次我在UUID上查找时都必须从磁盘读取。在这种情况下,mongoDB相比传统的关系数据库有很大的速度优势吗?

奖金问题:是否有现成的,已经建立的方式来做我想要实现的目标? :)

4 个答案:

答案 0 :(得分:3)

整个数据库不再适合物理内存,MongoDB不会突然变慢。 MongoDB目前使用基于内存映射文件的存储引擎。这意味着经常访问的数据通常会在内存中(操作系统受管理,但假设采用LRU方案或类似的东西)。

因此,它可能在此时或根本没有减速,这实际上取决于您的数据访问模式。与索引类似的故事,如果你(右)适当地平衡你的索引,如果你的用例允许它你可以有一个巨大的索引只有一小部分在物理内存中仍然有非常好的性能与大多数索引点击发生在物理记忆。

因为你在谈论UUID,所以这可能有点难以实现,因为不能保证同一组有限的用户正在产生绝大部分的吞吐量。在这些情况下,分片确实是维持服务质量的最合适方式。

答案 1 :(得分:1)

 This would be tens of gigabytes which I can't squeeze into server
     

记忆了。

这就是为什么MongoDB会为您提供分片,以便跨多个mongod实例(或副本集)对数据进行分区。

答案 2 :(得分:0)

除了考虑分片,或者甚至在考虑之前,您还应该尝试尽可能多地使用覆盖索引,特别是如果它适合您的用例。

这样您就无需将整个文档加载到内存中。你的索引可以提供帮助。

http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-CoveredIndexes

答案 3 :(得分:0)

如果您必须始终根据ID显示整个文档,那么一般的经验法则是尝试将e工作集保留在内存中。

http://blog.boxedice.com/2010/12/13/mongodb-monitoring-keep-in-it-ram/

这是谈论这一点的资源之一。 mongodb的网站上也有一个视频说明了这一点。

通过尝试调整ram的大小以使工作集在内存中,并且还在查看分片,您不必立即执行此操作,以后可以随时添加分片。这将提高您的应用程序的可扩展性。

同样,这些不是绝对的陈述,这些是一般性的指导方针,你应该考虑你的使用模式,并确保它们与你正在做的事情相关。

就我个人而言,我没有必要把所有东西都装进公羊。