- MongoDB 慢查询记录功能简介
如何定位 MongoDB 数据库的慢查询,我想应该是很多刚使用 MongoDB 数据库的朋友最想知道的问题。通过慢查询的定位,可以辅助对 MongoDB 中的 collection 进行优化。
MongoDB 数据库的慢查询数据其实存放在一个数据库集合 (collection) 中(system.profile),如果你不主动创建 system.profile 这个集合,那这个集合就固定 1M 大小,当慢查询记录超过 1M,就会将历史数据覆盖,循环使用,所以在这里需要根据业务实际情况设置集合大小。
在 MongoDB 中慢查询功能(Profiling)设置有三个级别,分别代表如下含义:
0:代表关闭,不收集任何慢查询
1:收集慢查询数据,默认收集超过 100 毫秒的慢查询
2:收集任何操作记录数据
可以通过在 MongoDB 中执行如下命令查看当前数据库的配置,需要特别注意的是,如果你在某一数据库中调整了该设置,那么该操作只对该数据库有效,其他数据库仍需要单独设置:
use test
'switched to db test'
db.getProfilingStatus()
{
was: 1, slowms: 1000, sampleRate: 1, ok: 1 }
- 如何设置慢查询
2.1 检查慢查询是否开启
执行 db.getProfilingStatus() 查询数据库,返回结果是 was: 0 代表 MongoDB 没有开启慢查询功能;对应的如果不是 0 则表示开启了慢查询监控功能。
2.2 开启慢查询功能
如果你想指定监控慢查询在某一毫秒值之上的查询,例如超过 1000 毫秒的查询被记录,可以通过如下语句进行设置:
db.setProfilingLevel(1, {
slowms: 1000 })
下面这个例子表示将慢查询的级别设置为 2
db.setProfilingLevel(2)
{
was: 1, slowms: 500, sampleRate: 1, ok: 1 }
db.getProfilingStatus()
{
was: 2, slowms: 500, sampleRate: 1, ok: 1 }
关掉慢查询功能
db.setProfilingLevel(0)
3. 如何查询慢查询日志
假设上面我们已经开启了慢查询监控功能,那在数据库使用过程中,会将 1000 ms 以上的执行查询进行记录,下面我们来看一下如何查询这些慢查询。
3.1 慢查询日志查看
查询最近的 10 个慢查询日志 (运行时间大于等于 8000 毫秒)
db.system.profile.find({
"millis":{
$gte:8000}}).limit(10).sort( {
ts : -1 } ).pretty()
查询大于 100 秒的日志
db.system.profile.find( {
millis : {
$gt : 100000 } } ).pretty()
查询时间从 2023-01-03 15 点整到 2023-01-03 15 点 30 分 之间的日志
db.system.profile.find({
ts : {
$gt: new ISODate("2023-01-03T07:00:00Z"),$lt: new ISODate("2023-01-03T07:30:00Z")}}).pretty()
备注:注意 Mongo 里面存储的 ISO 时间是格林尼治时间,我们当前 CST 时间为北京时间,需要在 ISO 上 +8,所以你可以看到上面我查询输入的时间为 7 点,但实际上查询的是 15 点的数据。
清理慢查询日志,设置大小
db.setProfilingLevel(0)
db.system.profile.drop()
db.createCollection( "system.profile", { capped: true, size: 1024*1024*10 } )
db.setProfilingLevel(1, { slowms: 5000 })
explain 使用
db.BotUserLog9.explain("executionStats").aggregate( [ { $group: { _id: "date", count: { "$sum": 1 } } } ])
标签:profile,MongoDB,db,system,查询,日志,及慢
From: https://www.cnblogs.com/abowu/p/18277372