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