记一次mongo慢查询排查记录

    技术2023-11-28  103

    背景

    近期收到客户反映,系统的认证日志不能根据用户查询接口总是报错具体报错为: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}后台创建索引不影响线上的业务。创建较慢创建成功之后,在次执行查询,很快得到响应

     

    Processed: 0.030, SQL: 10