【Mongodb】开启慢查询
Mongodb 慢查询
开启慢查询
- 获取当前监控状态
db.getProfilingStatus()
- 设置监控
db.setProfilingLevel(level,options) # 设置监控
level | integer | profiler level
0 : 关闭日志收集
1 : 收集大于slowms的日志
2 : 收集所有日志
options | document/integer | Optional
若是整数, 则赋值给slowms
若是对象 , 则是
slowms : 阈值 Default: 100 , 单位毫秒(milliseconds)
sampleRate : 采样率 Default: 1.0 , eg. 1 记录所有慢查询 , 0.5 记录50%的慢查询
- 获取慢查询
// 按执行时间排序获取前20条
db.system.profile.find().sort( { millis : -1 } ).limit(20).pretty();
// 获取最近20条执行数据
db.system.profile.find().limit(20).sort( { ts : -1 } ).pretty();
// 获取大于100ms的查询的20条数据
db.system.profile.find( { millis : { $gt : 100 } } ).limit(20).pretty()
// 获取时间范围段
db.system.profile.find({
ts : {
$gt: new ISODate("2020-06-09T03:00:00Z"),
$lt: new ISODate("2020-06-09T03:40:00Z")
}
}).limit(20).pretty()
注意: 分析可能会影响性能并与系统日志共享设置。在生产部署上配置和启用探查器之前,请仔细考虑所有性能和安全隐患。
监控技巧
在测试/生产环境中,一个数据库可能会被多个应用使用,生成的慢查询都会记录在一起,若能清晰区分各自应用都慢查询,能准确区分到各自应用进行调优/调试
在这里使用是appName区分各自应用,跟SQL Server的Application Name是一样道理。
假设现在我想监控我本地调试的所有Mongodb查询
-
写入所有查询
db.setProfilingLevel(0) db.system.profile.drop() db.createCollection( "system.profile", { capped: true, size: 1024 * 1024 * 4 } ) db.setProfilingLevel(2)
-
修改连接字符串
mongodb://<username>:<password>@127.0.0.1:27017/<database>?appName=wilson-debug
-
查询监控
db.system.profile.find({ appName: 'wilson-debug', ts: { $gt: new Date(ISODate().getTime() - 1000 * 60) } }) //一分钟内执行的语句 .sort({ ts: 1}) .limit(20) .pretty()
扩展
日志保存在system.profile集合中, 这是一个固定集合, 默认大小:1M.
若要修改system.profile固定集合大小 , 可按下面4步
- 禁止日志记录
- 删除system.profile集合
- 创建一个新system.profile 集合
- 重新启用分析
例如 : 创建一个4 MB大小的日志收集集合
db.setProfilingLevel(0)
db.system.profile.drop()
db.createCollection( "system.profile", { capped: true, size: 1024 * 1024 * 4 } )
db.setProfilingLevel(1, 100)
参考文章
https://docs.mongodb.com/manual/reference/command/profile/
https://docs.mongodb.com/manual/tutorial/manage-the-database-profiler/#database-profiling-overhead
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗