14

会变慢吗?只会为适合 RAM 的数据找到工作吗?如果 mongodb 索引大于 RAM,会发生什么?

4

2 回答 2

16

编辑:此答案不再适用(MongoDB 有一个不以这种方式运行的新存储引擎),答案非常陈旧,并且不推荐使用 mmapv1 存储引擎。

关于蒙哥

MongoDB 使用内存映射文件。

这意味着操作系统本质上控制着什么在内存中调入和调出(进出磁盘)。

规则

如果您的索引 + 工作集超出内存,则最近使用的页面(内存部分)将被刷新到磁盘。这只留下了最近使用的数据,这些数据仍然适合内存,随时可用。

您的操作系统对此进行控制。

如果您的真实工作集和索引不适合内存,您将体验到糟糕的性能,但实际上,一个工作集(热数据)的大小远小于其总数据集。

如果您不违反此规则,即使您的索引 + 总数据可能超过总可用内存,您也应该在大多数情况下拥有出色的性能。

这个怎么运作

如果执行的查询需要不在内存中的数据,它将被分页到内存中(从磁盘中检索),并且会影响性​​能。

注意:这本质上是数据库首次启动(冷)时的情况。

开始时内存中没有任何内容,需要数据时会发生页面错误,并根据需要将数据分页到内存中。当内存不足时,最近使用的页面(块)将从内存中刷新,以支持更热(最近访问)的数据。

另外值得一提的是,由于索引经常使用,因此总是最近使用,它们实际上永远不会被分页。

于 2012-04-12T21:44:58.563 回答
6

如果您的索引大于可用 RAM,则性能会迅速下降。MongoDB 站点特别建议您“确保您的索引可以放入 RAM”。

如果您的查询看起来很缓慢,您应该验证您的索引是否足够小以适合 RAM。例如,如果您在 4GB RAM 上运行并且有 3GB 索引,那么您的索引可能不适合 RAM。您可能需要添加 RAM 和/或验证您创建的所有索引是否都在实际使用中。

于 2012-04-13T02:37:36.213 回答