116、案例实战:千万级数据删除导致的慢查询优化实践(1)
00 分钟
2022-8-26

116、案例实战:千万级数据删除导致的慢查询优化实践(1)

接下来学习一个新的案例,这个案例是我们之前线上系统遇到过的一个慢查询调优实战案例,案例的背景是,当时有人删除了千万级的数据,结果导致了频繁的慢查询,接下来学习一下这个案例整个排查、定位以及解决的一个过程。
这个案例的开始,当时是从线上收到大量的慢查询告警开始的,当我们收到大量的慢查询告警之后,就去检查慢查询的SQL,结果发现不是什么特别的SQL,这些SQL语句主要都是针对一个表的,同时也比较简单,而且基本都是单行查询,看起来似乎不应该会慢查询。
所以这个时候我们是感觉极为奇怪的,因为SQL本身完全不应该有慢查询,按说那种SQL语句,基本上都是直接根据索引查找出来的,性能应该是极高的。
那么有没有另外一种可能,慢查询不是SQL的问题,而是MySQL生产服务器的问题呢?
这里给大家解释一下,实际上个别特殊情况下,MySQL出现慢查询并不是SQL语句的问题,而是他自己生产服务器的负载太高了,导致SQL语句执行很慢。
给大家举个例子,比如现在MySQL服务器的磁盘IO负载特别高,也就是每秒执行大量的高负载的随机IO,但是磁盘本身每秒能执行的随机IO是有限的。
结果呢,就导致你正常的SQL语句去磁盘上执行的时候,如果要跑一些随机IO,你的磁盘太繁忙了,顾不上你,导致你本来很快的一个SQL,要等很久才能执行完毕,这个时候就可能导致正常SQL语句也会变成慢查询
所以同理,除了磁盘之外,还有一个例子就是网络,也许网络负载很高,就可能会导致你一个SQL语句要发送到MySQL上去,光是等待获取一个跟MySQL的连接,都很难,要等很久,或者MySQL自己网络负载太高了,带宽打满,带宽打满了之后,你一个SQL也许执行很快,但是他查出来的数据返回给你,网络都送不出去,此时也会变成慢查询。
另外一个关键的点就是CPU负载,如果说CPU负载过高的话,也会导致CPU过于繁忙去执行别的任务了,没时间执行你这个SQL语句,此时也有可能会导致你的SQL语句出现问题的,所以这个大家也得注意。
所以说慢查询本身不一定是SQL导致的,如果你觉得SQL不应该慢查询,结果他那个时间段跑这个SQL就是慢,此时你应该排查一下当时MySQL服务器的负载,尤其看看磁盘、网络以及CPU的负载,是否正常
如果你发现那个时间段MySQL生产服务器的磁盘、网络或者CPU负载特别高,那么可能是服务器负载导致的问题。
举个例子,我们之前解决过一个典型的问题,就是当某个离线作业瞬间大批量把数据往MySQL里灌入的时候,他一瞬间服务器磁盘、网络以及CPU的负载会超高。
此时你一个正常SQL执行下去,短时间内一定会慢查询的,针对类似的问题,优化手段更多的是控制你导致MySQL负载过高的那些行为,比如灌入大量数据,最好在凌晨低峰期灌入,别影响线上系统运行。
结果奇怪的是,当时我们看了下MySQL服务器的磁盘、网络以及CPU负载,一切正常,似乎也不是这个问题导致的。
这个时候,似乎看起来有点误解了是不是?别着急,这个案例的排查过程是极为漫长的,涉及到MySQL大量的调优只是,最终解决这个问题,甚至要深入我们之前讲过的MySQL内核级原理,才能分析清楚以及解决问题。
今天我们先站在当时的角度,给大家分析我们的头两步排查手段,一个是检查SQL是否有问题,主要就是看他的执行计划,这个我们之前都讲过了,另外一个是检查MySQL服务器的负载,今天我们也说明了背后的一些知识。
那么在这两种办法都不奏效之后,下一次我们就要给大家讲当时我们排查问题的第三步,就是用MySQL profilling工具去细致的分析SQL语句的执行过程和耗时

评论