4-3 Mongodb慢查询分析
最后更新于:2022-04-02 07:39:50
### **1、描述:**
我们使用钉钉做数据库慢日志告警,8月27号收到大量的全表扫描的告警信息,登录到相关业务的服务器打开日志,开始搜索相关日志,看到如下的日志信息。
![](images/screenshot_1576198362411.png)
#### **1.1、分析一下日志:**
执行操作的具体时间、连接的id信息conn10433,command 后边是dbname.tablename对哪个库的那个表进行的操作,执行具体的操作为find dbname.tablename筛选的条件为{ id:28137 }取一行,singleBatch:true 确认是否在第一批之后关闭光标,默认为false,$db:数据库名字,全表扫描扫描了667917行、查询耗时325毫秒。
### **2、排查:**
因为我们_id是主键,默认是有索引的,是否是业务新添加了id的字段,我们需要检查一下这张表的索引和数据字段。
连接复制集群的一个SECONDARY节点查看索引:
```
rs2:SECONDARY> db.check_log.getIndexes()
[
{
"v" : 1,
"key" : {
"number" : 1
},
"name" : "number",
"ns" : "check.check_log"
},
{
"v" : 1,
"key" : {
"createTime" : 1
},
"name" : "createTime",
"ns" : "check.check_log"
},
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "check.check_log"
}
]
```
#### **2..1、查看表数据**
我这里只展示部分数据,没有查看到新添加的id字段。
```
rs2:SECONDARY> db.check_log.find()
{ "_id" : NumberLong(115864478), "num" : NumberLong(10), "createTime" : NumberLong("1519974767169") }
{ "_id" : NumberLong(115869609), "num" : NumberLong(10), "createTime" : NumberLong("1519974768174") }
{ "_id" : NumberLong(105539931), "num" : NumberLong(1), "createTime" : NumberLong("1519974862116") }
{ "_id" : NumberLong(115915468), "num" : NumberLong(1), "createTime" : NumberLong("1519974864362") }
```
#### **2.2、和业务先沟通**
和业务线进行沟通是否有新上线业务,确认以后和业务一起查看业务查询check_log表的代码。
![](images/screenshot_1577166685018.png)
仔细检查代码发现在转换上缺少了一个下划线**where("_id").is("id")**
#### **2.3、explain执行计划**
我们可以使用Mongodb的explain来帮助我们分析数据库执行计划。
> db.check_log.find({"_id":})
';