2010-05-11 55 views
29

我即将采用MongoDB进行一个新项目,我选择它来获得灵活性,而不是可扩展性,因此将在一台机器上运行它。从文档和Web帖子我不断阅读,所有索引都在RAM中。这对我来说没有意义,因为我的索引很容易大于可用RAM的数量。MongoDB索引/内存关系

任何人都可以分享索引/ RAM关系的一些见解,以及当单个索引和所有索引都超过可用RAM的大小时会发生什么?

回答

28

MongoDB保持它在RAM中的索引。它们将以LRU为基础进行交换。您经常会看到一些文档,建议您将“工作集”保留在内存中:如果您实际访问的索引部分适合内存,则无问题。

+2

好简单明了的解释准确地计算出'工作set',让我们说我有一个单一的集合。然后,运行'db.collection.stats()'。 'filesize'或'datasize'表示我的“工作集?” – 2013-10-09 18:26:37

8

这是工作集大小加上MongoDB的索引,理想情况下应该驻留在RAM中,即可用RAM的数量理想情况下应该至少是工作集大小加上索引大小加上剩下的OS(操作系统)和运行在同一台机器上的其他软件的需求。如果可用RAM小于此值,LRU就会发生什么情况,因此我们可能会显着减速。 需要记住的一件事是,在一个索引中,btree桶被缓存,而不是单个索引键,即如果我们在包括历史数据的索引中有一个统一的键分布,我们可能需要更多的RAM索引。我们有一个时间复合指数加上别的东西。对于后者,同一个btree桶中的键通常来自同一个时代,所以这个警告不会发生。 另外,我们应该记住,我们在BSON中的字段名称存储在记录中(但不是索引),所以如果我们处于内存压力下,他们应该保持简短。

那些对MongoDB的当前虚拟内存使用感兴趣的人(当然也是关于内存),可以看看mongod的状态。

@see http://www.markus-gattol.name/ws/mongodb.html#sec7