MongoDB慢日誌分析

2021-07-29 07:30:02 字數 2785 閱讀 2860

**:

在 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 來定義查過多少秒的查詢算是慢查...