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