一次sql引起的服务器Cpu飙高

一日悠闲的写代码时,突然,阿里云发来监控报警,cpu飙到94%。

11382761-1659a4164dce5556.png
image.png

打开阿里云RDS数据库,查看慢SQL日志看到。
我的一条sql执行时间长达371s,执行了6分钟的sql该是多么恐怖的事情和严重的后果。吓得我心疼,以后写任何一条sql,我估计我的心都要提到头顶写。

11382761-ede920bde600b4eb.png
image.png
11382761-83222c76719fe7e4.png
image.png

解决过程:
1.该sql属于统计类的sql,本身关联的表多,数据量大。本身sql有些许复杂。
2.最初,第一版sql,经过很多的sql优化,查询时长最长的时候可以达到1s。也还没有很夸张,后面一次版本迭代,需求发生了变化,直接在sql本身进行了修改,忘记了原来在时长上做了功夫的,也忘了此条sql本身的时长问题。结果,上线时,该sql正常执行是3s。已经很大了。在进行需求的改版时,就应该想到sql优化问题,奈何当时只注重了需求而忘了优化,该死。
3.陆陆续续经常可以看到sql执行时间竟然达到18s,40s,此时,就应该觉察出来突然飙到这么高,肯定非同寻常。想了很多原因,竟漏了一个最重要的原因。此需求最初一般上线之时,因为风险问题,做了限制,只能分配给管理员可以看。并且,管理员查询频次不高,每天也就一次,故而1s,没有进行特别的再优化。后面,运营应该让产品把这个权限开发了,开给了所有人,并且我是不知道的。
4.看日志时间可以看到,此操作开出去之后操作频率非常高,并且很多人同时操作,慢慢的sql执行时间达到了371s。

select tmp.* from ( select 
a.id,a.reviewer,a.order_id,a.audit_conclusion, 
a.created_at 
from (select * from customer_credit_audit where 
audit_status=6 and order_id in (select order_id from     
 customer_credit_audit where audit_status=7 and 
 created_at >= '2019-01-17 00:00:00' and created_at <= 
  '2019-01-17 23:59:59' )  ORDER BY created_at DESC ) 
 a GROUP BY a.order_id) as tmp where ( tmp.reviewer 
like CONCAT('%','初审测试员','%') OR tmp.reviewer like 
CONCAT('%','汪萍','%') OR tmp.reviewer like 
CONCAT('%','张丽','%') OR tmp.reviewer like 
CONCAT('%','李汇','%') OR tmp.reviewer like 
CONCAT('%','童助伍','%') OR tmp.reviewer like 
CONCAT('%','吴亚玲','%') OR tmp.reviewer like 
CONCAT('%','王文娟','%') OR tmp.reviewer like 
CONCAT('%','赵金梅','%') OR tmp.reviewer like 
CONCAT('%','尚真真','%') OR tmp.reviewer like 
CONCAT('%','鲍传卫','%') )

解决:
1.将一条sql完成的事情分成两个接口来完成,前端配合传值
2.因为本身该加的索引都加上了,故而索引上没再下文章

通过这种解决方式,sql执行速度达到100多ms,总算,速度下来了。
此次事件,要引以为戒,任何一条sql都要考虑优化的问题。
和潜在的风险。以后,即使需求进行了限制,只能谁谁谁看,一定要考虑多人操作的情形。

猜你喜欢

转载自blog.csdn.net/weixin_34001430/article/details/87101761
今日推荐