3

私は、fastmod が update-in-place のようないくつかの操作を指定していると考えていました。私のアプリでは、「$」修飾子を使用して _id による更新を行っています。次に例を示します。

$colleciton->update(
    array('_id' => $id),
    array(
        '$inc' => array('hits' => new MongoInt32(1)),
        '$set' => array(
                      'times.gen' => gettimeofday(true),
                      'http.code' => new MongoInt32(200)
         )
    ),
    array('safe'=>false,'multiple'=>false,'upsert'=>false)
);

私はそのようなログを持っています:

Wed Jul 25 11:08:36 [conn7002912] update mob.stat_pages query: { _id: BinData } update: { $inc: { hits: 1 }, $set: { times.gen: 1343203715.684896, http.code: 200 } } nscanned:1 nupdated:1 keyUpdates:0 locks(micros) w:342973 342ms

ご覧のとおり、ログには「fastmod」フラグがありません。挿入時に「times.gen」フィールドと「http.code」フィールドを設定したため、「移動」フラグはありません。パディング ファクターは 1.0 です。

私は何か間違ったことをしていますか、それとも fastmod の意味を誤解していますか?

4

1 に答える 1

3

ログの「fastmod」がインプレース更新を意味することは正しいです。ログに記録された fastmod/in-place 操作が省略される理由として考えられるのは、次のとおりです。

  1. 実際には存在しないフィールドを設定またはインクリメントしているため、インプレース操作ではなく追加する必要があります
  2. ログには遅いクエリ (デフォルトでは 100 ミリ秒を超える) しか表示されないため、インプレース クエリはログに記録するには速すぎる可能性があります。
  3. ログから判断すると、2.1 または 2.2 を使用しているようです。新しいバージョンに切り替えた場合、メッセージは消えましたか?

これをさらに調べるという点では:

プロファイラーを見て、別の設定で試してみてください。注: プロファイリングは負荷を追加するため、慎重に使用してください。

また、起動時または次のいずれかで、slowms の値を低く設定することもできます。

> db.setProfilingLevel(0,20) // slow threshold=20ms
于 2012-07-25T12:06:57.247 に答える