2012-07-25 44 views
3

我認爲fastmod指定了一些操作,如更新就地。 在我的應用程序,我用「$」修飾符_id做更新,例如:「fastmod」在mongodb日誌中意味着什麼

$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的含義?

+0

你試過在尋找的源代碼? – 2012-07-25 08:42:18

+0

不,我沒有。我不確定這會對我有幫助。我不是那麼熟練的:( – evilive 2012-07-25 08:45:15

+0

但是你爲什麼想要知道這一點?對我來說這似乎是一個非常先進的知識:) – 2012-07-25 08:46:33

回答

2

你是正確的,日誌中的「fastmod」意味着就地更新。爲登錄fastmod /就地操作遺漏一些可能的原因:

  1. 你實際上是設置或增加不存在的字段,所以它必須加入,而不是替代操作
  2. 的日誌只顯示慢查詢(默認> 100ms),所以就地的可能發生得太快而無法記錄
  3. 您似乎正在使用2.1或2.2來判斷日誌 - 消息是否在切換/切換時消失到新版本?

在尋找這個方面進一步:

看一看the profiler,嘗試不同的設定,注意事項:剖析增加負載 - 所以要小心使用。

您也可以嘗試設置slowms值的情況下,無論是在啓動時或:

> db.setProfilingLevel(0,20) // slow threshold=20ms 
+0

是的,我正在使用_version:2.2.0-rc0_,我看到fastmod更新日誌早於同一版本。我會嘗試設置ProfilingLevel(2)幾分鐘,然後檢查是否有任何fastmod更新。 – evilive 2012-07-25 12:18:45

+0

好的。我試過了。當我將ProfilingLevel設置爲1或2時,fastmod標誌出現在日誌中(有時它們不是真的很快^ _ ^,但是它們是存在的,最長的我看到的是大約0.4秒)但是當我將PROFILE Level設置爲0時,「fastmod」標誌從登錄。可以嗎? – evilive 2012-07-26 18:37:10

+0

是的 - 這意味着任何時候(或者至少大部分時間)你擊中了一個fastmod並且正在進行一個就地更新,但是對於要記錄的默認緩慢操作,它的閾值爲100ms。當更新無法在適當位置進行時(例如字段不存在),那麼速度會變慢,而不是fastmod並打破100ms閾值,因此會被記錄下來 - 這是否合理? – 2012-07-26 20:47:10