我参与了一个项目,他们获得足够的RAM来将整个数据库存储在内存中。据经理说,这是10Gen推荐的。这是违反直觉的。这真的是你想要使用Mongodb的方式吗?
答案 0 :(得分:0)
这不是反直觉的......实际上我发现非常直观。
在How much faster is the memory usually than the disk?中,您可以阅读:
(...)当您执行顺序时,内存只会快6倍 访问(内存为350 Mvalues /秒,相比之下为58 Mvalues / sec) 盘);但当你做 随机时, 快了大约100,000倍 访问 强>
因此,如果您可以将所有数据都放在RAM中,那就非常好了,因为您将非常快速地读取数据。
关于MongoDB,来自FAQ's:
在一台小机器上运行MongoDB当然是可能的 可用内存量。
MongoDB会自动使用机器上的所有可用内存 缓存。系统资源监视器显示MongoDB使用了很多 内存,但它的用法是动态的。如果突然需要另一个过程 在服务器的RAM的一半,MongoDB将为另一个提供缓存的内存 过程
从技术上讲,操作系统的虚拟内存子系统可以管理 MongoDB的记忆。这意味着MongoDB将使用尽可能多的可用内存 尽可能根据需要交换到磁盘。 具有足够内存的部署 在RAM中适应应用程序的工作数据集将达到最佳效果 性能 强>
问题是您通常拥有的数据远多于可用内存。然后你必须转到磁盘,磁盘I / O很慢。关于数据库性能,避免全扫描查询是关键(访问磁盘时更为重要)。因此,如果您的数据集不适合内存,则应该针对绝大多数访问模式设置索引并尝试fit those indexes in memory:
如果您已为查询和工作数据集创建了索引 适合RAM,MongoDB提供内存中的所有查询。
答案 1 :(得分:0)
这一切都取决于数据库的大小。我猜你说你的数据库实际上很小,否则我无法看到10gen的人是如何给出这样的建议的,我的意思是@Stennie甚至没有给出这样的建议(顺便提一下他是10gen)。
即使您的数据库很小,我也看不到经理的建议。 MongoDB不进行自己的内存管理,因为它不会将数据“固定”到像memcached或其他基于内存的数据库那样的页面。
这意味着mongod
数据的分页可能是非常不可预测的,例如,您将花费更多时间来保存RAM而不是分页数据。这就是为什么最好确保你的工作集适合它并且它可以加载速度,这些都是基于你的硬件和查询。
@Stennies评论几乎总结了你应该对MongoDB采取的立场。