记一次mongo慢查询排查记录

针对客户反馈的系统认证日志查询接口报错问题,通过分析发现是由于MongoDB查询超时导致。博客详细介绍了从问题定位到解决方案的过程,包括检查数据库记录数、索引状态,以及如何优化索引提高查询效率。

背景

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

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值