【问题标题】:MongoDB and update-in-placeMongoDB 和就地更新
【发布时间】:2016-10-22 00:54:35
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 测量它真的很简单
  • 否,因为 MongoDB 使用惰性写入,或者我不知道如何衡量它。
  • hmmmm.. 试试这个:www.mongodb.org/display/DOCS/getLastError+Command#getLastErrorCommand-{{fsync}}
  • 我同时尝试了它,但我更愿意确定有一个可以确定它的人的答案:D

标签: mongodb


【解决方案1】:

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

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

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

在我的应用中,mongodb 在普通硬件上每个实例每秒处理 10-50k 次更新。

【讨论】:

  • 10-50K 启用期刊?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 2018-01-16
    相关资源
    最近更新 更多