美文网首页
线上问题之慢Sql一定是Sql慢吗

线上问题之慢Sql一定是Sql慢吗

作者: 土豆肉丝盖浇饭 | 来源:发表于2018-11-23 21:23 被阅读28次

问题解答

答案是不。就我现在的经验来分析,引起慢Sql的原因有两个,第一个,真的慢,第二个,资源被别人占用,锁不释放,导致我们的sql一直阻塞,变成慢sql。那么,为什么资源会被一直占用么,那就说明你的事务时间太长,可能是其他运行的sql慢或者其他的IO操作阻塞(比如Http调用)。

问题复盘

今天临近下班在钉钉收到两个线上预警,而且都是@我的。



第一个是调用推送Api超时了,我看了下,没怎么在意,觉得是偶发情况吧。
第二个是慢sql,并且这个是update语句,重复相同的13个相同sql超时,但是就语句来看 应该是命中索引的,本身执行肯定快,成为慢sql肯定是资源被占用了。但是看了代码我也没发现什么特殊的地方(这个模块的推送我这期重构了改成异步了)。就认为是其他地方资源占用,导致这边被超时了。

但是后面我经验丰富的TL经过代码分析一下问题后,真相浮出水面。

这个问题Sql是在一个消息的消费者代码中,伪逻辑如下

//事务开始
修改订单信息(占用资源,其他线程阻塞)
修改对应订单车辆为起运
推送(超时了)
其他系统索引同步
//事务结束

一个订单有13辆车,所以有13个起运消息发动过来,并且是并发的,当第一条消息消费的时候,推送方法超时了,10秒的timeout才返回,那么其他消费者就会阻塞在第一句修改的sql调用上。直到第一条消费结束,过了10多秒,其他的消费者才从阻塞中依次恢复。

上面看视没有关联的两个告警联系到了一起,不过我没看出来的问题,我觉得还是因为我这个版本已经重构掉了。。不是现场的代码。

以后对于线上告警,我要好好重视,都是学习的机会。

问题总结

不要在事务内运行除了数据库操作以外的会引起阻塞的调用,比如推送,发短息,同步索引这些操作,都进行异步解耦。

还有一个公司的监控系统真的是相当重要。

下面是我公众号,大家可以关注下。


image

相关文章

  • 线上问题之慢Sql一定是Sql慢吗

    问题解答 答案是不。就我现在的经验来分析,引起慢Sql的原因有两个,第一个,真的慢,第二个,资源被别人占用,锁不释...

  • 我公司的技术架构演化(二)性能优化

    之前说到,我们的慢sql因为早期的程序员都很初级,因此,线上跑的慢sql满天飞;虽然做了DB隔离,把慢sql的影响...

  • 执行计划分析

    上周线上的数据库慢日志统计中,有几条我所在项目的SQL查询光荣上榜,经过优化解决绝大多数关键SQL查询慢的问题,过...

  • MySQL优化----SQL语句和索引优化

    sql及索引优化 如何发现有问题的sql? 使用Mysql的慢查询日志对有效率问题的SQL进行监控 慢查询日志所包...

  • MySQL - 时间格式不合法引起的慢SQL

    今天线上有个服务出现了大量的慢SQL 导致IOPS大幅抖动 SQL: SELECT DISTINCT stc.US...

  • 慢sql问题总结

    1、 导致慢 SQL 的原因 在遇到慢 SQL 情况时,不能简单的把原因归结为 SQL 编写问题(虽然这是最常见的...

  • java数据库之sql优化

    一、导致SQL慢的原因 (1)硬件问题:网络慢,IO慢,内存不足,吞吐量小,磁盘空间满 (2)Sql写法问题 (3...

  • 干货|Java高级编程之慢SQL问题经验总结

    在遇到慢 SQL 情况时,不能简单的把原因归结为 SQL 编写问题(虽然这是最常见的因素),实际上导致慢 SQL ...

  • 性能分析与 EXPLAIN 详解

    一、sql查询慢原因及优化 1、导致慢 SQL 的原因 在遇到慢 SQL 情况时,不能简单的把原因归结为 SQL ...

  • 数据库索引相关问题

    如何定位并优化慢查询Sql 根据慢日志定位慢查询sql 使用explain等工具分析sql 修改sql或者尽量让s...

网友评论

      本文标题:线上问题之慢Sql一定是Sql慢吗

      本文链接:https://www.haomeiwen.com/subject/wossqqtx.html