mongodb的Profiling功能->慢查询功能
Profiling 把收集到的信息写入到system.profile集合中,system.profile集合是一个capped collection。
1.定位mongodb慢查询语句方法:
开启Profiling功能,通过定位慢查询日志,找到执行比较慢的语句,然后进行优化,思路如下:
a.查询慢查询日志(system.profile)找到超过定义时间的慢查询语句;
b.explain()查看执行计划,可以参考如下文章:http://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.慢查询(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