会变慢吗?只会为适合 RAM 的数据找到工作吗?如果 mongodb 索引大于 RAM,会发生什么?
2 回答
编辑:此答案不再适用(MongoDB 有一个不以这种方式运行的新存储引擎),答案非常陈旧,并且不推荐使用 mmapv1 存储引擎。
关于蒙哥
MongoDB 使用内存映射文件。
这意味着操作系统本质上控制着什么在内存中调入和调出(进出磁盘)。
规则
如果您的索引 + 工作集超出内存,则最近使用的页面(内存部分)将被刷新到磁盘。这只留下了最近使用的数据,这些数据仍然适合内存,随时可用。
您的操作系统对此进行控制。
如果您的真实工作集和索引不适合内存,您将体验到糟糕的性能,但实际上,一个工作集(热数据)的大小远小于其总数据集。
如果您不违反此规则,即使您的索引 + 总数据可能超过总可用内存,您也应该在大多数情况下拥有出色的性能。
这个怎么运作
如果执行的查询需要不在内存中的数据,它将被分页到内存中(从磁盘中检索),并且会影响性能。
注意:这本质上是数据库首次启动(冷)时的情况。
开始时内存中没有任何内容,需要数据时会发生页面错误,并根据需要将数据分页到内存中。当内存不足时,最近使用的页面(块)将从内存中刷新,以支持更热(最近访问)的数据。
另外值得一提的是,由于索引经常使用,因此总是最近使用,它们实际上永远不会被分页。
如果您的索引大于可用 RAM,则性能会迅速下降。MongoDB 站点特别建议您“确保您的索引可以放入 RAM”。
如果您的查询看起来很缓慢,您应该验证您的索引是否足够小以适合 RAM。例如,如果您在 4GB RAM 上运行并且有 3GB 索引,那么您的索引可能不适合 RAM。您可能需要添加 RAM 和/或验证您创建的所有索引是否都在实际使用中。