6

我有一个非常大的 MongoDB 对象,大约 2MB。

我必须经常更新 readCount 字段,并且我需要确保操作非常快。

我知道“就地更新”,我可以发送这个简单的操作

db.pages.update( { name:"SamplePage" }, { $inc: { readCount : 1 } } );

但是 MongoDB 如何在内部处理该操作?它从磁盘加载所有文档,修改值,并存储整个文档,或者,如果文档大小没有改变,它能够仅在磁盘上更新相对于 readCount 值的文件部分?

4

2 回答 2

13

MongoDB 使用内存映射文件进行数据文件管理。这实际上意味着 mongo 不会从磁盘加载文档。相反,它会尝试访问该文档所在的内存页面。如果该页面尚未在 RAM 中,则操作系统继续从磁盘中获取它。

写作完全一样。Mongo 尝试写入内存页面。如果它在 RAM 中,那么它是超快的(只是交换内存中的一些位)。该页面被标记为脏,操作系统将负责将其刷新回磁盘(保留您的更改)。

如果您启用了日志,那么您的插入/更新会更加昂贵,因为 mongodb 必须对仅附加文件进行另一次写入。

在我的应用程序中,mongodb 在适度的硬件上每个实例每秒处理 10-50k 更新。

于 2012-04-08T04:21:45.247 回答
0

MongoDB 根据项目增长或移动的频率计算每个集合的填充因子。更经常增长更大的填充因子。在内部,它使用自适应算法来尝试最小化更新的移动。基本上它在 RAM 中运行。

于 2016-10-21T16:54:35.417 回答