它会变慢吗?只处理适合内存的数据? 如果MongoDB的索引超过RAM会发生什么?
它会变慢吗?只处理适合内存的数据? 如果MongoDB的索引超过RAM会发生什么?
编辑:此回答不再适用(MongoDB有了新的存储引擎,不再以这种方式运行),该答案非常陈旧,mmapv1存储引擎已弃用。
关于Mongo
MongoDB使用内存映射文件。
这意味着操作系统基本上控制着何时将数据从内存中分页进出(到磁盘)。
规则
如果索引和工作集大小超过内存容量,则最近最少使用的页面(内存部分)将被刷新到磁盘。这样就只会保留最近使用的能够轻松放入内存的数据。
您的操作系统控制这一点。
虽然如果真正的工作集和索引不符合内存容量时,性能会很差,但在实际情况下,一个人的工作集(热数据)的大小远小于他们的总数据集。
如果不违反此规则,即使索引和总数据可能超过可用内存的总量,大多数时间您的性能都应该很好。
如何运作
如果执行需要不在内存中的数据的查询,则会将其换入内存(从磁盘检索),并且会出现性能下降。
注意:这基本上是在首次启动数据库(冷启动)时的情况。
一开始没有任何数据在内存中,需要数据时会发生页错误,并根据需要将数据分页到内存中。当内存不足时,最近最少使用的页面(块)被刷新出内存,以便保留更热(最近访问)的数据。
此外值得一提的是,由于索引经常被使用,因此始终是最近使用过的,它们几乎永远不会被换出。