我们使用钉钉做数据库慢日志告警,8月27号收到大量的全表扫描的告警信息,登录到相关业务的服务器打开日志,开始搜索相关日志,看到如下的日志信息。
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表的代码。
仔细检查代码发现在转换上缺少了一个下划线where("_id").is("id")
2.3、explain执行计划
我们可以使用Mongodb的explain来帮助我们分析数据库执行计划。
db.check_log.find({"_id":})