这是一个基本的问题,但非常重要,我不确定是否能真正理解这一点.

在官方文件上我们可以看到

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

我不太明白的是

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

这里的"索引"是什么意思?

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

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

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

您建议如何在全局使用MongoDB来获得巨大的流量?

推荐答案

Note:这是在2013年写的,当时MongoDB还很年轻,它没有今天的功能,虽然这个答案对于mmap仍然适用,但对于MongoDB现在实现的其他存储技术,如WiredTiger或Percona,它没有.


一个很好的开始理解what is指数:http://docs.mongodb.org/manual/core/indexes/

在你复习完这一点之后,你会发现他们为什么如此优秀,然后跳转到一些更复杂的问题.

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

一种方法是查看任何查询explain()上的yields字段.这将告诉您读卡器因为数据不在RAM中而释放锁的次数.

另一个更深入的方法是看mongostat等节目.这些程序将告诉您mongod上发生了哪些页面错误(当数据需要从磁盘分页到RAM中时).

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

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

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

我不知道你怎么想的...我的意思是,这两种方法做的事情完全不同,如果您打算在启动时将MongoDB中的数据读取到应用程序中,并将其写入var,那么我绝对不会推荐这样做.

此外,用于内存管理的操作系统算法非常成熟和快速,所以它是可以的.

您建议如何在全局使用MongoDB来获得巨大的流量?

嗯,这是个大问题.真的,我建议你在这个主题上用谷歌搜索一下,但正如文档所述,你需要确保你的工作集适合RAM.

这里有一个很好的起点:What does it mean to fit "working set" into RAM for MongoDB?

Mongodb相关问答推荐

从MongoDB中的一个非空字段获取值

匹配/筛选/投影对象中数组中数组中的嵌套字段

如何使用mongodb进行离线开发?

使用mongo'db.Decode(&dto)映射一个嵌套的 struct

如何在查找 foreignField 中使用通配符?

如何在 MongoDB 中对字段进行自定义排序

为什么一个 mongodb 副本集需要奇数个投票 node ?

MongoDB - 如果新值更大,则更新字段

MongoDB 是否重用已删除的空间?

你如何在 Kubernetes 上设置 Mongo 副本集?

mongodump 是否锁定数据库?

将数据插入 MongoDB - 没有错误,没有插入

`fields cannot be identical'和''` mongoimport错误

如何使用 MongoDB Compass 对数据进行排序

在 MongoDB 上使用 $push 更新数组时避免重复值

获取 mongodb 中所有唯一标签的列表

MongoDB备份计划

如何通过键名从 mongoDB 中检索值?

用 MongoDB 中的属性表示多对多关系的最佳模型

Spring Data MongoDB - 在哪里以编程方式为 Mongo 集合创建索引?