第十八章 優(yōu)化器profile在MySQL中,慢查詢?nèi)罩臼墙?jīng)常作為我們優(yōu)化數(shù)據(jù)庫的依據(jù),那在MongoDB中是否有類似的功能呢?答案是肯定的,那就是MongoDB Database Profiler。所以MongoDB不僅有,而且還有一些比MySQL的Slow Query Log更詳細的信息。 18.1 開啟 Profiling 功能有兩種方式可以控制 Profiling 的開關和級別,第一種是直接在啟動參數(shù)里直接進行設置。 啟動MongoDB時加上–profile=級別 即可。 也可以在客戶端調(diào)用db.setProfilingLevel(級別) 命令來實時配置,Profiler 信息保存在 system.profile中。我們可以通過db.getProfilingLevel()命令來獲取當前的Profile級別,類似如下操作 > db.setProfilingLevel(2); { "was" : 0, "slowms" : 100, "ok" : 1 } |
上面profile的級別可以取0,1,2 三個值,他們表示的意義如下: l 0 – 不開啟 l 1 – 記錄慢命令 (默認為>100ms) l 2 – 記錄所有命令
Profile 記錄在級別1時會記錄慢命令,那么這個慢的定義是什么?上面我們說到其默認為100ms,當然有默認就有設置,其設置方法和級別一樣有兩種,一種是通過添加–slowms啟動參數(shù)配置。第二種是調(diào)用db.setProfilingLevel時加上第二個參數(shù): db.setProfilingLevel( level , slowms ) db.setProfilingLevel( 1 , 10 ); | 18.2 查詢 Profiling 記錄與MySQL的慢查詢?nèi)罩静煌,MongoDB Profile 記錄是直接存在系統(tǒng)db里的,記錄位置 system.profile ,所以,我們只要查詢這個Collection的記錄就可以獲取到我們的 Profile 記錄了。列出執(zhí)行時間長于某一限度(5ms)的 Profile 記錄: db.system.profile.find( { millis : { $gt :5 } } )
查看最新的 Profile 記錄: db.system.profile.find().sort({$natural:-1}).limit(1) > 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 } > |
字段說明: l ts: 該命令在何時執(zhí)行 l info: 本命令的詳細信息 l reslen: 返回結(jié)果集的大小 l nscanned: 本次查詢掃描的記錄數(shù) l nreturned: 本次查詢實際返回的結(jié)果集 l millis: 該命令執(zhí)行耗時,以毫秒記
MongoDB Shell 還提供了一個比較簡潔的命令show profile,可列出最近5條執(zhí)行時間超過1ms的 Profile 記錄。
| 免費IT培訓(ChinaDBA.net)實踐者!學費1元,全捐公益
| | 使用道具
|
|