您好,登錄后才能下訂單哦!
mongodb的Profiling功能->慢查詢功能
Profiling 把收集到的信息寫入到system.profile集合中,system.profile集合是一個capped collection。
1.定位mongodb慢查詢語句方法:
開啟Profiling功能,通過定位慢查詢日志,找到執行比較慢的語句,然后進行優化,思路如下:
a.查詢慢查詢日志(system.profile)找到超過定義時間的慢查詢語句;
b.explain()查看執行計劃,可以參考如下文章:https://blog.51cto.com/1937519/2301699
c.確定語句慢的原因,如缺少索引,業務批量問題等,思路與傳統的rdbms的sql優化等同;
2.開啟慢查詢:
2.1:Profiling級別說明:
a.0:關閉,不收集任何數據。
b.1:收集慢查詢數據,默認是100毫秒。
c.2:收集所有數據
2.2:數據庫慢查詢配置(注意寫入配置文件,重啟后生效):
a.查看狀態:級別和時間
repsetzhou:PRIMARY> db.getProfilingStatus()
{ "was" : 1, "slowms" : 200 }
b.查看級別
repsetzhou:PRIMARY> db.getProfilingLevel()
1
c.設置級別
repsetzhou:PRIMARY> db.setProfilingLevel(2)
{ "was" : 1, "slowms" : 200, "ok" : 1 }
d.確認設置級別:
repsetzhou:PRIMARY> db.getProfilingLevel()
2
e.說明:設置級別和時間(1000 相當于1s)
repsetzhou:PRIMARY> db.setProfilingLevel(1,1000) ###(包括級別、時間參數,時間是毫秒單位)
{ "was" : 2, "slowms" : 1000, "ok" : 1 }
2.3:在配置文件中開啟慢查詢:
operationProfiling:
slowOpThresholdMs: 200
mode: slowOp
3.關閉Profiling:
a.關閉:
repsetzhou:PRIMARY> db.setProfilingLevel(0)
{ "was" : 2, "slowms" : 1000, "ok" : 1 }
b.確認:
repsetzhou:PRIMARY> db.getProfilingStatus()
{ "was" : 0, "slowms" : 1000 }
4.修改system.profile的大小:
a.關閉Profiling:
repsetzhou:PRIMARY> db.setProfilingLevel(0)
{ "was" : 0, "slowms" : 200, "ok" : 1 }
b.刪除system.profile集合:
repsetzhou:PRIMARY> db.system.profile.drop()
true
c.創建一個新的system.profile集合 - 10M:
repsetzhou:PRIMARY>db.createCollection( "system.profile", { capped: true, size:10000000 } )
{ "ok" : 1 }
d.重新開啟Profiling:
repsetzhou:PRIMARY> db.setProfilingLevel(1)
{ "was" : 0, "slowms" : 200, "ok" : 1 }
5.1慢查詢(system.profile)分析:
repsetzhou:PRIMARY> db.system.profile.find()
a.查詢大于指定時間如500毫秒:
db.system.profile.find({"millis":{$gte:500}})
b.查詢指定時間慢查詢:
db.system.profile.find(
{
ts : {
$gt : new ISODate("2018-10-22T03:01:45.976Z"),
$lt : new ISODate("2018-10-22T03:01:48.976Z")
}
}
)
c.顯示5最近的事件:
show profile
5.2:在mongodb的日志文件中同樣記錄慢查詢日志,如果system.profile已經被覆蓋,可以參考mongodb的后臺日志。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。