记一次mongo慢查询排查记录

背景

近期收到客户反映,系统的认证日志不能根据用户查询接口总是报错具体报错为:com.mongodb.MongoSocketReadTimeoutException:Timeout while receiving message

分析排查

  1. 既然报错信息为mongo数据库超时,逐步定位应该是查询超时导致的。
  2. 于是连接生产数据库看下查询collection的总记录数 db.xxx.find({}).count(); 查到竟然有3000万条记录。
  3. 接下来思考为什么这么慢,mongo这么厉害3000万条应该没问题,于是就想看下有没有加索引
  4. 自己模拟客户操作做了一次查询,然后在mongo执行 db.currentOp()查询当前操作,下图可分析到,当前操作已查询包括两个条件,但是只给一个条件加了索引,然后执行db.xxx.getIndexes();查看当前的索引,果然如此、
  5. 后来自己又做了一个验证 db.xxx.find({property.useId:22222}).explain();下图可看到该条件进行了全表的扫描。
  6. 优化加索引 db.xxx.createIndex({property.useId:hashed},{background:true} )注{background:true}后台创建索引不影响线上的业务。创建较慢
  7. 创建成功之后,在次执行查询,很快得到响应

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章