**:
在 mysql中,慢查詢日誌是經常作為我們優化資料庫的依據,那在mongodb中是否有類似的功能呢?答案是肯定的,那就是mongo database profiler.不僅有,而且還有一些比mysql的slow query log更詳細的資訊。它就是我們這篇文章的主題。
開啟 profiling 功能
有兩種方式可以控制 profiling 的開關和級別,第一種是直接在啟動引數裡直接進行設定。
啟動mongodb時加上–profile=級別 即可。
也可以在客戶端呼叫db.setprofilinglevel(級別) 命令來實時配置。可以通過db.getprofilinglevel()命令來獲取當前的profile級別。
> db.setprofilinglevel(2);
> db.getprofilinglevel()
上面斜體的級別可以取0,1,2 三個值,他們表示的意義如下:
0 – 不開啟
1 – 記錄慢命令 (預設為》100ms)
2 – 記錄所有命令
profile 記錄在級別1時會記錄慢命令,那麼這個慢的定義是什麼?上面我們說到其預設為100ms,當然有預設就有設定,其設定方法和級別一樣有兩種,一種是通過新增–slowms啟動引數配置。第二種是呼叫db.setprofilinglevel時加上第二個引數:
db.setprofilinglevel( level , slowms )
db.setprofilinglevel( 1 , 10 );
查詢 profiling 記錄
與mysql的慢查詢日誌不同,mongo profile 記錄是直接存在系統db裡的,記錄位置 system.profile ,所以,我們只要查詢這個collection的記錄就可以獲取到我們的 profile 記錄了。
> db.system.profile.find()
nreturned:1 bytes:50" , "millis" : 0}
db.system.profile.find( )
nreturned:2 bytes:86" , "millis" : 0}
} nreturned:0 bytes:20" , "millis" : 0}
列出執行時間長於某一限度(5ms)的 profile 記錄:
> db.system.profile.find( } )
檢視最新的 profile 記錄:
db.system.profile.find().sort()
mongo shell 還提供了乙個比較簡潔的命令show profile,可列出最近5條執行時間超過1ms的 profile 記錄。
profile 資訊內容詳解:
ts-該命令在何時執行.
millis time-該命令執行耗時,以毫秒記.
info-本命令的詳細資訊.
query-表明這是乙個query查詢操作.
ntoreturn-本次查詢客戶端要求返回的記錄數.比如, findone()命令執行時 ntoreturn 為 1.有limit(n) 條件時ntoreturn為n.
query-具體的查詢條件(如x>3).
nscanned-本次查詢掃瞄的記錄數.
reslen-返回結果集的大小.
nreturned-本次查詢實際返回的結果集.
update-表明這是乙個update更新操作.
fastmod-indicates a fast modify operation. see updates. these operations are normally quite fast.
fastmodinsert – indicates a fast modify operation that performed an upsert.
upsert-表明update的upsert引數為true.此引數的功能是如果update的記錄不存在,則用update的條件insert一條記錄.
moved-表明本次update是否移動了硬碟上的資料,如果新記錄比原記錄短,通常不會移動當前記錄,如果新記錄比原記錄長,那麼可能會移動記錄到其它位置,這時候會導致相關索引的更新.磁碟操作更多,加上索引更新,會使得這樣的操作比較慢.
insert-這是乙個insert插入操作.
getmore-這是乙個getmore 操作,getmore通常發生在結果集比較大的查詢時,第乙個query返回了部分結果,後續的結果是通過getmore來獲取的。
mongodb 查詢優化
如果nscanned(掃瞄的記錄數)遠大於nreturned(返回結果的記錄數)的話,那麼我們就要考慮通過加索引來優化記錄定位了。
reslen 如果過大,那麼說明我們返回的結果集太大了,這時請檢視find函式的第二個引數是否只寫上了你需要的屬性名。(類似 於mysql中不要總是select *)
對於建立索引的建議是:如果很少讀,那麼盡量不要新增索引,因為索引越多,寫操作會越慢。如果讀量很大,那麼建立索引還是比較划算的。(和rdbms一樣,貌似是廢話 -_-!!)
mongodb 更新優化
如果寫查詢量或者update量過大的話,多加索引是會有好處的。以及~~~~(省略n字,和rdbms差不多的道理)
use fast modify operations when possible (and usually with these, an index). see updates.
profiler 的效率
轉
mysql慢日誌解析 mysql 慢日誌分析
啟用 slow log 有兩種啟用方式 1,在my.cnf 裡 通過 log slow queries file name 2,在mysqld程序啟動時,指定 log slow queries file name 選項 比較的五款常用工具 mysqldumpslow,mysqlsla,myprofi...
mysqldumpslow 慢日誌分析
usage mysqldumpslow opts.logs.一 常用選項 v,輸出詳細資訊 d,除錯 s,是order的順序 al 平均鎖定時間 ar 平均返回記錄時間 at 平均查詢時間 預設 c 計數 l 鎖定時間 r 返回記錄 t 查詢時間 r,反向排序,最大的在最後 t,是top n的意思,...
MySQL 慢日誌 如何開啟慢日誌?如何分析?
mysql 慢日誌 如何開啟慢日誌?如何分析?一 mysql如何開啟 慢查詢?1 修改配置檔案,開啟慢日誌 window my.ini linux my.cnf 新增配置 定義慢查詢日誌的路徑 log slow queries mysql slow query.log 來定義查過多少秒的查詢算是慢查...