38

这是一个基本问题,但非常重要,我不确定是否真的明白这一点。

在官方文档上我们可以阅读

MongoDB 将所有最近使用的数据保存在 RAM 中。如果您为查询创建了索引并且您的工作数据集适合 RAM,则 MongoDB 从内存中提供所有查询。

我不确定的部分是

如果您为查询创建了索引并且您的工作数据集适合 RAM

这里的“索引”是什么意思?

例如,如果我更新一个模型,然后我查询它,因为我已经更新了它,它现在在 RAM 中,所以它将来自内存,但这在我的脑海中并不是很清楚。

我们如何确定我们查询的数据是否来自内存?我知道 MongoDB 使用空闲内存来缓存有关当前空闲内存的数据,但是有人可以进一步解释全局行为吗?

在哪种情况下,在存储数据的节点服务器中使用变量比信任 MongoDB 缓存系统更好?

您如何在全球范围内建议使用 MongoDB 来处理巨大的流量?

4

2 回答 2

32

注意:这是在 2013 年写的,当时 MongoDB 还很年轻,它没有今天的功能,虽然这个答案仍然适用于 mmap,但它不适用于 MongoDB 现在实现的其他存储技术,例如 WiredTiger ,或佩尔科纳。


开始了解什么是索引的好地方:http: //docs.mongodb.org/manual/core/indexes/

在你复习之后,你会理解为什么它们如此出色,但是,跳过一些更复杂的问题。

我们如何确定我们查询的数据是否来自内存?

一种方法是查看yields任何查询中的字段explain()。这将告诉您有多少次读者因为数据不在 RAM 中而产生了锁定。

另一种更深入的方法是查看诸如mongostat 之类的程序和其他此类程序。这些程序将告诉您在您的mongod.

我知道 MongoDB 使用空闲内存来缓存有关当前空闲内存的数据,但是有人可以进一步解释全局行为吗?

这实际上是不正确的。说 MongoDB 做到这一点更容易,但实际上它没有。实际上是操作系统和它自己的分页算法,通常是LRU,为 MongoDB 做这件事。MongoDB 会在一段时间内缓存索引计划,这样它就不必不断地检查和测试索引。

在哪种情况下,在存储数据的节点服务器中使用变量比信任 MongoDB 缓存系统更好?

不知道你期望它如何工作......我的意思是两者做的事情完全不同,如果你打算在启动时将数据从 MongoDB 读入你的应用程序到那个 var 中,那么我绝对不会推荐它。

此外,内存管理的操作系统算法非常成熟和快速,所以没关系。

您如何在全球范围内建议使用 MongoDB 来处理巨大的流量?

嗯,这是一个很大的问题。真的,我会建议你在这个主题上稍微谷歌一下,但正如文档所述,你需要确保你的工作集适合一个人的 RAM。

这是一个很好的起点:将“工作集”放入 MongoDB 的 RAM 意味着什么?

于 2013-07-08T19:52:18.203 回答
7

MongoDB 尝试将整个集合保存在内存中:它对每个集合页面进行内存映射。对于要在内存中的所有内容,数据页和引用它们的索引都必须保存在内存中。

如果 MongoDB 返回一条记录,您可以放心,它现在在内存中(无论它是否您的查询之前)。

MongoDB 不会像 Web 浏览器那样保留记录的“缓存”。当您提交更改时,内存和磁盘都会更新。

当与适当的用例相匹配时,Mongo非常棒。如果您有足够的服务器内存来缓存所有内容,则性能非常高,并且在该点之后迅速下降很多很多大容量的网站都使用 MongoDB:现在内存如此便宜是件好事。

于 2013-07-08T19:49:51.197 回答