您好,登錄后才能下訂單哦!
MongoDB Database Profiling
MongoDB Profiler是一個捕獲數據庫執行活動的系統,它可以幫助識別慢查詢和操作。
Profiling級別
可用的捕獲級別意義如下:
級別 設置
0 禁用
1 啟用,只記錄慢操作
2 啟用,記錄所有操作
查看Profiling級別
> db.getProfilingLevel()
啟用Profiler
> db.setProfilingLevel(1)
完整命令為:
db.setProfilingLevel(level,slowms)
當level為1的時候,慢操作的默認值為100ms,若指定慢操作為500ms:
> db.setProfilingLevel(1,500)
注意:
在默認情況下,mongod記錄所有的慢查詢(由showOpThresholdMs定義,默認值為100ms)到MongoDB日志文件中。
只在關鍵時候啟用Profiling,盡量不要在生產環境啟用它。
基于獨立mongod實例啟用Profiling。該設置將不會通過副本集或分片集群擴散到其他實例。
查看Profiler結果
使用的是system.profile 來記錄,而system.profile 是一個capped collection。在你的數據庫的system.profile集合,調用mongo shell命令show profile,或者查詢system.profile集合可以查看Profiler的輸出,如:
db.system.profile.find( { millis : { $gt : 1000 } } )
就可以輸出,查詢時間大于1秒的慢查詢。
Profiler信息內容詳解
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來獲取的。
性能優化
盡管我們沒有啟用Profiler,但在生產環境中,我們查看日志文件仍可以看到大于100ms的慢操作。
tail -f /data/var/log/mongodb/mongod.log
Mon May 25 02:57:22.670 [conn756] query MyTest.Pro query: { $query: { CutePath: /^122-133-1456(-\d+)*$/, Avail.Status: { $lt: 5 }, $or: [ { _id: { $lt: 3310 } }, { _id: { $gt: 8520, $lt: 8530 } }, { _id: { $gt: 9720, $lt: 9730 } } ] }, $orderby: { Avail.Status: 1, AvgRate: -1 } } ntoreturn:200 ntoskip:0 nscanned:18764 scanAndOrder:1 keyUpdates:0 numYields: 10 locks(micros) r:217999 nreturned:200 reslen:563505 116ms
如果nscanned(掃描的記錄數)遠大于nreturned(返回結果的記錄數)的話,那么我們就要考慮通過加索引來優化記錄定位了。
reslen 如果過大,那么說明我們返回的結果集太大了,這時請查看find函數的第二個參數是否只寫上了你需要的屬性名。
對于創建索引的建議是:如果很少讀,那么盡量不要添加索引,因為索引越多,寫操作會越慢。如果讀量很大,那么創建索引還是比較劃算的。
參見:
http://docs.mongodb.org/manual/administration/analyzing-mongodb-performance/#database-profiling
http://docs.mongodb.org/master/MongoDB-crud-guide.pdf
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。