MongoDB和就地更新

das*_*h1e 4 mongodb

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

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

我知道"就地更新",我能够发送这个简单的操作

db.pages.update( { name:"SamplePage" }, { $inc: { readCount : 1 } } );
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*sev 11

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

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

如果你启用了日志,那么你的插入/更新会更昂贵,因为mongodb必须再次写入仅附加文件.

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

  • 启用日志后10-50K? (2认同)