0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一次分页慢查询导致的事故处理过程

马哥Linux运维 ? 来源:马哥Linux运维 ? 2023-08-21 16:44 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

事故背景

这次事故也是我们组里遇到的一次关于分页慢查询的典型例子,通过这篇文章,你可以很清晰的跟随我们还原事故现场,以及每一步遇到问题做出的调整和改动。

事故问题现场

  • 16:00 收到同事反馈,融合系统分?查询可?率降低
  • 16:05 查询接?UMP监控,发现接?TP99异常彪?
9527948e-3ea6-11ee-ac96-dac502259ad0.png95589bc4-3ea6-11ee-ac96-dac502259ad0.png

打开机器监控,发现?乎所有机器的TP999都异常的?,观察机器CPU监控,发现CPU使?率并不?

9577a9ec-3ea6-11ee-ac96-dac502259ad0.png
  • 16:10 查看数据库监控,发现数据库CPU异常彪?,定位到是数据库问题,同时收到了?量的慢SQL邮件。
959c7ce0-3ea6-11ee-ac96-dac502259ad0.png

定位到这里,我们基本确定这个不是几分钟能解决的问题,于是我们分成两步去处理。第一步:打开限流,防止更多的慢sql请求进行 第二步:分析慢sql,进行改造上线 查看慢SQL,?部分都是融合系统分?查询接?涉及到的SQL,同时由于上游系统在15:35左右对于该接?调?流量激增,和数据库CPU暴涨,接?TP999暴涨的时间吻合,推测是由于库存对于该接?的调?对于数据库造成了压?,导致接?耗时增加。但是该接?的调?量并不?,再次查看慢SQL,发现有?量已经遍历到?百?的慢SQL。推测是深分?的问题。

  • 16:15 排查?志发现,?部分SQL都指向商家xxxx,查询发现其下有10W条数据(占?总数量的?分之?),MQ发现有?量重试,分?查询接?超时时间发现配置的是2S。推测是慢查询导致的?频次重试将数据库的性能拖垮。
  • 16:25 观察代码后,确定了是深分?问题,确定下来了优化?案。为了避免库存修改接?,?先我们优化SQL将其优化为?查询的形式。即先通过pageNo和pageSize查询出ID,然后取出当中的最?值和最?值,然后使?范围查询去查询出来全表数据。由于线上持续对数据库造成压?,先让上游把MQ的消费暂停消费。
  • 17:40 优化代码上线,上游重新打开MQ消费,但是由于消费积累的消息?较多,直接打开后,还是对融合数据库造成了压?。接?的TP99再次飙升,数据库CPU再次飙到100%。
  • 18:00 复盘了下,决定不再优化旧接?,?是开发新接?,基于滚动ID进?分?查询。需要推动上游?起参与开发和联调。
  • 22:20 新接?上线,重新放开MQ消费,上游积压了?量消息的情况下,新接?表现平稳,“问题解决”
95b1e058-3ea6-11ee-ac96-dac502259ad0.png

问题原因和解决?法

深分?出现原因

问题SQL:

select*fromtablewhereorg_code=xxxxlimit1000,100

以上?的SQL为例,MySQL的limit?作原理就是先读取前?1000条记录,然后抛弃前1000条,读后?100条想要的,所以?码越?,偏移量越?,性能就越差。

深分?的?种解决?法

查询ID+基于ID查询

即先使?查询条件查询出来id,再通过id进?范围查询,也就是说我第?次优化的时候使?的?法 ?先查询出来ID,以上?的SQL为例

selectidfromtablewhereorg_code=xxxxlimit1000,5

然后查询出来id后,使?id进?in查询,由于是直接基于主键的in查询,所以效率较?

select*fromtablewhereidin(1,2,3,4,5);

基于ID查询优化

由于在第?次查询已经查询出来了所有符合条件的ID了,可以使?范围查询来替代in查询,效率更?(in 查询需要和集合??的元素进??对,但是范围查询只需要?较最?和最?即可)

select*fromtablewhereorg_code=xxxxandid>=1andid<=?5;

使??查询

selecta.id,a.dj_sku_id,a.jd_sku_idfromtableajoin(selectidfrom

jd_spu_skuwhereorg_code=xxxxlimit1000,5)b

ona.id=b.id;

使??查询可以减少和数据库的IO交互,也是?种常?的解决深分?的?法。

使?滚动查询

每次接?都会返回查询出来的数据的最?的id(游标),下?次查询传?这个游标,服务端只需要根据这个游标,取出id?于这个游标的n个数据即可。n为每?展示条数。

select*fromtablewhereorg_code=xxxxandid>0limit10;

这种?式服务端实现起来?较简单且性能很好。缺点是需要客户端修改,且需要保证ID是?增有序且结果需要是按照ID排序的。最终定下的是使?滚动查询的?法。最终优化SQL上线后,表现平稳。第?周和库存?起重新优化了?多规格SKU的SQL。如下:

SELECTid,dj_org_code,dj_sku_id,jd_sku_id,ynFROMtablewhere

org_code=xxxxandid>0orderbyidasclimit500

测试了没问题后上线。观察线上监控稳定。本以为?枕?忧的时候,?周之后,数据库再次出现了?量的慢查询,数据库CPU报警,观察接?监控:

95d1f28a-3ea6-11ee-ac96-dac502259ad0.png

可以看到在调?量并不?的前提下,接?的耗时达到了60S。联系运维同学帮忙排查,发现了?量的慢 SQL:

SELECTid,dj_org_code,dj_sku_id,jd_sku_id,ynFROMtablewhere

org_code=xxxxandid>0orderbyidasclimit500

可以看出来,这就是我们优化后的SQL。运维同学explain这条sql后发现,这条SQL?了主键索引,没有?我们以为应该要?的org_code的索引。

95fc651a-3ea6-11ee-ac96-dac502259ad0.png

和运维初步沟通后得出结论,在某些情况下,主键索引的优先级是会?于普通索引的。

最终解决方案

引用join

因为我们使?了主键索引进?排序,且查询了不在索引树只在叶?节点中的字段。因此mysql认为主键索引更优,因为既可以排序,?不?回表,所以就使?主键索引最终导致了全表扫描。

最终使?了先查询ID(不查询叶?节点字段保证使?索引),在通过join,使?查询出来的ID来查询对应的数据的SQL:

selecta.idASid,a.dj_org_codeASdjOrgCode,a.dj_sku_idAS

djSkuId,a.jd_sku_idASjdSkuId,a.ynASynfrom

tableajoin

(

SELECTidFROMtablewhereorg_code=xxxxandid>0order

byidasclimit500

)tona.id=t.id;

再次explain了下,可以发现?了我们既定的索引:

9627f84c-3ea6-11ee-ac96-dac502259ad0.png

于是上线,解决问题。上线稳定后,分析之前的问题SQL,执?下?两条语句,同样的SQL,不同的商家,MYSQL的执?结果也是不?样的

964c2a96-3ea6-11ee-ac96-dac502259ad0.png

查询资料找原因

查阅资料得知

  • MYSQL会将limit的数量和where条件?查询出的数量进??对,如果limit数量占?较? (例如某些商家的sku数??较多),则会"优化"为主键索引,因为MYSQL此时认为?主键索引会减少 ?次索引树的查询,且可以在较短时间??得到结果。(没有LIMIT不会?主键索引)
  • 因此在where 索引A order by 主键索引 limit N的这种SQL,需要考虑MYSQL优化主键索引的情况。
  • 除了上?最终上线后的优化SQL,也可以通过force index强制使?索引:
SELECTid,dj_org_code,dj_sku_id,jd_sku_id,ynFROMtableforce

index(idx_upc)whereorg_code=xxxxandid>0orderbyidasclimit

500

但是这种写死了索引名称的?式,如果以后修改了索引名,容易导致安全隐患。

问题总结

  • B端系统也需要考虑对??系统的保护,接?限流等,防?异常流量或者异常调?把??的系统调死。这次幸亏上游系统是通过MQ调?融合API的,可以暂停消费,如果是?API调?,且流量较?,持续让数据库处于?压状态,会影响到融合系统的整体稳定性。
  • 针对可能出现的?险点绝不姑息。这次这个分?查询sku的接?,之前就看到过,但是当时觉得这个接?在数据量较少的情况下性能也还好,?且也有了商家维度的索引,就放过了,考虑后续优化。结果现在就爆出了问题。
  • 针对SQL的优化,上线前要谨慎,?且需要同?条SQL,需要针对不同的边界情况(例如这次的多SKU的商家)进?反复测试,调整。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11116

    浏览量

    218319
  • API
    API
    +关注

    关注

    2

    文章

    1709

    浏览量

    64512
  • SQL
    SQL
    +关注

    关注

    1

    文章

    785

    浏览量

    45478

原文标题:坑惨了!一次分页慢查询导致的事故处理过程

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    文了解MyBatis的查询原理

    本文通过MyBatis个低版本的bug(3.4.5之前的版本)入手,分析MyBatis的一次完整的查询流程,从配置文件的解析到查询的完
    的头像 发表于 10-10 11:42 ?1758次阅读

    处理温度控制模拟VI 输出阶段的处理过程

    处理温度控制模拟VI 输出阶段的处理过程 输出阶段处理过程所要实现的功能为:根据计算阶段处理产生的风扇打开和关闭执行命令;检查前
    发表于 10-08 09:22

    vison assistant中的图像处理过程

    新手求教!在vision assistant中验证图片时在图像处理画面可以看到图像的处理过程,但完成退回到labview中后,为什么在显示的 图片中看不到处理过程呢?
    发表于 06-24 15:55

    JPA分页查询的常用方法

    JPA分页查询与条件分页查询
    发表于 10-23 17:10

    51单片机中断处理过程有几个

    51单片机中断处理过程有几个,文章目录中断定义预备知识正文中断对于刚上大的小伙伴,应该和我样第一次见到“中断”这个词。估计也困扰了许多小伙伴很久,今天以我的角度重新给大家说
    发表于 07-22 09:32

    污水处理过程仪表技术的研究现状

    污水处理过程固有的非线性、时变性特征对传感器的可靠性、适应性提出了很高的要求。污水处理过程涉及多种传感器,多数传感器是污水处理过程所特有的,分别为人们提供所监
    发表于 12-20 15:11 ?10次下载

    污水处理过程仪表技术的研究现状

    污水处理过程固有的非线性、时变性特征对传感器的可靠性、适应性提出了很高的要求。污水处理过程涉及多种传感器,多数传感器是污水处理过程所特有的,分别为人们提供所监
    发表于 01-07 15:39 ?15次下载

    一次过程的等值电路

    一次过程的等值电路 图 一次过程的等值电路 在电动机端子上安装阻抗匹配器可
    发表于 07-18 11:24 ?1853次阅读
    <b class='flag-5'>一次</b>波<b class='flag-5'>过程</b>的等值电路

    数字电视的典型的处理过程

    典型的处理过程 下面介绍数字电视的几个典型的处理过程
    发表于 07-31 14:23 ?1671次阅读
    数字电视的典型的<b class='flag-5'>处理过程</b>

    SQL查询的原因分析总结

    sql 查询的48个原因分析 1、没有索引或者没有用到索引(这是查询最常见的问题,是程序设计的缺陷)。 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列
    发表于 03-08 11:58 ?0次下载

    MyBatis流式查询轻松帮你解决分页的问题

    结果。流式查询的好处是能够降低内存使用。 如果没有流式查询,我们想要从数据库取 1000 万条记录而又没有足够的内存时,就不得不分页查询,而分页
    的头像 发表于 08-04 15:52 ?4693次阅读

    个由于MySQL分页导致的线上事故

    其实对于我们的 MySQL 查询语句来说,整体效率还是可以的,该有的联表查询优化都有,该简略的查询内容也有,关键条件字段和排序字段该有的索引也都在,问题在于他
    的头像 发表于 05-10 15:31 ?1006次阅读

    MyBatis Plus解决大数据量查询问题

    在实际工作中当指定查询数据过大时,我们般使用分页查询的方式页的将数据放到内存
    的头像 发表于 01-16 10:17 ?2216次阅读

    mybatis逻辑分页和物理分页的区别

    这两种分页方式的区别。 逻辑分页是在数据库中执行查询时使用的分页方式。这种方式是通过在查询
    的头像 发表于 12-03 14:54 ?1332次阅读

    MySQL查询终极优化指南

    作为名在生产环境摸爬滚打多年的运维工程师,我见过太多因为查询导致的线上故障。今天分享套经过实战检验的MySQL
    的头像 发表于 08-13 15:55 ?114次阅读