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