繁体   English   中英

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

[英]mongoDB vs relational databases when data can't fit into memory?

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

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

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

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

奖金问题:有没有一种既定的方式来做我想要实现的目标? :)

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

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

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

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

记忆了。

这就是为什么MongoDB为您提供分片以跨多个mongod实例(或副本集)划分数据的原因。

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM