关于当前MongoDB实例是否存在性能瓶颈可参考以下几篇文章,大致了解当前数据库相关性能指标情况,本文主要讲解若我们需要对MongoDB进行一些SQL优化时可采取的措施和方法。
MongoDB监控之OS监控:https://blog.csdn.net/weixin_37692493/article/details/113757816
MongoDB监控之数据库监控:https://blog.csdn.net/weixin_37692493/article/details/113757888
MongoDB监控之慢日志:https://blog.csdn.net/weixin_37692493/article/details/113763366
一、查看当前会话,抓取正在慢的SQL
对于正在发生的问题,我们可以通过查看当前会话,尝试抓取正在慢的问题查询
- 直接查询当前所有的会话
db.currentOp()
- 根据某些指定条件查询指定的会话信息
db.currentOp(
{
"active" : true,
"secs_running" : { "$gt" : 3 },
"ns" : /^db1\./
}
)
- 重点关注
client #请求是由哪个客户端发起
opid #操作的opid,可以通过 db.killOp(opid) 直接杀掉会话
secs_running/microsecs_running
#这个值重点关注,代表请求运行的时间,如果这个值特别大,就得注意了,看看请求是否合理
query/ns: #这个能看出是对哪个集合正在执行什么操作
lock*: #还有一些跟锁相关的参数
二、查看慢日志
对于已经发生过去,现场已经没有现场的历史问题,我们可以通过查询对应问题时间段中的慢日志来大致判断问题查询。
- 查看当前慢日志参数状态
> db.getProfilingStatus()
{ "was" : 1, "slowms" : 100 }
- 动态修改参数
> db.setProfilingLevel(1,10)
{ "was" : 1, "slowms" : 100, "ok" : 1 }
> db.getProfilingStatus()
{ "was" : 1, "slowms" : 10 }
- 查询最近慢日志记录
> db.system.profile.find().sort({$natrual: -1})
MongoDB默认是不开启慢日志功能的,对于线上环境,建议开启该参数。该参数可以在数据库内动态开启。
- 主要关注点:
1)全表扫描:
关键字:COLLSACN、docsExamined
关注以上关键字,对全表扫描查询(或者更新/删除)建立合理索引进行优化。
2)不合理查询
关键字:IXSCAN、keysExamined
对于复合索引,需要注意索引建立的前后顺序,以及对排序的优化。
3)大量数据排序
关键字:关键字:SORT、hasSortStage
如果SQL需要对大量的数据进行排序,且排序无法通过索引来进行排序,MongoDB会把结果集放在内存进行排序,非常消耗CPU资源。可以考虑通过索引降低结果集大小或者利用索引进行排序来进行优化。
三、性能评估测试
如果以上问题都解决了,没有别的优化空间,但是数据库负载还是很高,可以考虑升配。