这是一个基本问题,但非常重要,我不确定是否真的明白了。
在官方文档中我们可以阅读
MongoDB将所有最近使用的数据保存在RAM中。如果您为查询创建了索引,并且您的工作数据集适合RAM,则MongoDB将从内存中提供所有查询。
我不确定的部分是
如果您已为查询创建索引,并且您的工作数据集适合RAM
是什么意思"索引"这里吗?
例如,如果我更新模型,那么我查询它,因为我已经更新它,它现在在RAM中,所以它将来自内存,但这在我看来并不是很清楚。
我们怎样才能确定我们查询的数据是否来自内存?据我所知,MongoDB使用空闲内存来缓存当前可用的内存数据,但有人可以进一步解释全局行为吗?
在哪种情况下,在我们的节点服务器中使用存储数据的变量比信任MongoDB缓存系统更好?
您如何全球建议使用MongoDB进行大量流量?
答案 0 :(得分:26)
一个开始准确理解 索引的好地方:http://docs.mongodb.org/manual/core/indexes/
在你完成了这些工作后,你会发现它们为什么如此优秀,然而,跳过一些更为复杂的问题。
我们怎样才能确定我们查询的数据是否来自内存?
一种方法是查看任何查询yields
上的explain()
字段。这将告诉您读者产生锁定的次数,因为数据不在RAM中。
另一个更深入的方法是查看像mongostat这样的程序和其他类似的程序。这些程序将告诉您mongod
上发生了哪些页面错误(需要将数据从磁盘分页到RAM中)。
据我所知,MongoDB使用空闲内存来缓存当前可用的内存数据,但有人可以进一步解释全局行为吗?
这实际上是不正确的。简单地说MongoDB可以做到这一点更容易,但事实上并非如此。事实上,操作系统及其自己的分页算法(通常是LRU)为MongoDB执行此操作。 MongoDB确实将索引计划缓存了一段时间,因此它不必经常检查和测试索引。
在哪种情况下,在我们的节点服务器中使用存储数据的变量比信任MongoDB缓存系统更好?
不确定您希望如何工作......我的意思是两者做了完全不同的事情,如果您打算在启动时将MongoDB中的数据读入您的应用程序,那么我绝对不会推荐它。
除了内存管理的OS算法非常成熟和快速,所以没关系。
嗯,这是一个非常大的问题。我真的会向你推荐Google这个主题,但正如文档所述,你需要确保你的工作集适合RAM。您如何全球建议使用MongoDB进行大量流量?
这是一个很好的起点:What does it mean to fit "working set" into RAM for MongoDB?
答案 1 :(得分:6)
MongoDB尝试将整个集合保留在内存中:它对每个集合页面进行内存映射。对于内存中的所有内容,数据页和引用它们的索引必须保存在内存中。
如果MongoDB返回一条记录,你可以放心它现在在内存中(无论是之前你的查询)。
MongoDB不像网页浏览器那样保留记录的“缓存”。提交更改时,内存和磁盘都会更新。
与适当的用例匹配时,Mongo 很好。如果您有足够的服务器内存来缓存所有内容,那么非常高性能,并且在此之后迅速下降。很多很多大型网站都使用MongoDB:现在内存非常便宜是件好事。