6

約 2MB の非常に大きな MongoDB オブジェクトがあります。

readCount フィールドを頻繁に更新する必要があり、操作が非常に高速であることを確認する必要があります。

「インプレース更新」について知っていて、この簡単な操作を送信できます

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

しかし、MongoDB はその操作を内部的にどのように処理するのでしょうか? ディスクからすべてのドキュメントをロードし、値を変更してドキュメント全体を保存するか、ドキュメントのサイズが変わらない場合は、readCount 値に関連するファイル部分のみをディスク上で更新できますか?

4

2 に答える 2

13

MongoDBは、データファイル管理にメモリマップトファイルを使用します。これが実際に意味するのは、mongoがディスクからドキュメントをロードしないということです。代わりに、そのドキュメントが配置されているメモリページにアクセスしようとします。そのページがまだRAMにない場合、OSは先に進み、ディスクからページをフェッチします。

書くことはまったく同じです。Mongoはメモリページに書き込もうとします。それがRAMにある場合、それは超高速です(メモリ内のいくつかのビットを交換するだけです)。ページはダーティとしてマークされ、OSがディスクにフラッシュバックします(変更を保持します)。

ジャーナルを有効にしている場合、mongodbは追加専用ファイルに別の書き込みを行う必要があるため、挿入/更新は多少コストがかかります。

私のアプリでは、mongodbは、適度なハードウェアでインスタンスごとに1秒あたり10〜50kの更新を処理します。

于 2012-04-08T04:21:45.247 に答える