在MySQL中,慢查詢日誌是經常作為我們最佳化資料庫的依據,那在MongoDB中是否有類似的功能呢?答案是肯定的,那就是MongoDB Database Profiler。所以MongoDB 不僅有,而且還有一些比MySQL的Slow Query Log更詳細的資訊。
開啟 Profiling 功能
有兩種方式可以控制 Profiling 的開關和層級,第一種是直接在啟動參數裡直接進行設定。 啟動MongoDB時加上–profile=層級 即可。 也可以在用戶端調用 db.setProfilingLevel(層級) 命令來即時配置,Profiler 資訊儲存在 system.profile 中。我們可以通過db.getProfilingLevel()命令來擷取當前的Profile層級,類似如下操作
db.setProfilingLevel(2);
上面profile的層級可以取0,1,2 三個值,他們表示的意義如下:
0 – 不開啟
1 – 記錄慢命令 (預設為>100ms)
2 – 記錄所有命令
Profile 記錄在層級 1 時會記錄慢命令,那麼這個慢的定義是什麼?上面我們說到其預設為100ms,當然有預設就有設定,其設定方法和層級一樣有兩種,一種是通過添加–slowms 啟動參數配置。第二種是調用db.setProfilingLevel時加上第二個參數:
db.setProfilingLevel( 1 , 10 );
查詢 Profiling 記錄
與 MySQL 的慢查詢日誌不同,MongoDB Profile 記錄是直接存在系統 db 裡的,記錄位置 system.profile ,所以,我們只要查詢這個 Collection 的記錄就可以擷取到我們的 Profile 記錄了。列出執行時間長於某一限度(5ms)的 Profile 記錄:
db.system.profile.find( { millis : { $gt : 5 } } )
查看最新的 Profile 記錄:
db.system.profile.find().sort({$natural:-1}).limit(1)
{ "ts" : ISODate("2012-05-20T16:50:36.321Z"), "info" : "query test.system.profile reslen:1219
nscanned:8 \nquery: { query: {}, orderby: { $natural: -1.0 } } nreturned:8 bytes:1203", "millis" : 0 }
欄位說明
ts: 該命令在何時執行 info: 本命令的詳細資料 reslen: 返回結果集的大小 nscanned: 本次查詢掃描的記錄數 nreturned: 本次查詢實際返回的結果集
millis: 該命令執行耗時,以毫秒記
MongoDB Shell 還提供了一個比較簡潔的命令 show profile,可列出最近5 條執行時間超過
1ms的 Profile 記錄。