几条 SQL 把数据库干崩了,事后还大言不惭!


点击上方"数据与人", 右上角选择“设为星标”
分享干货,共同成长!


给大家分享一个发生在近期的真实案例。整个处理过程让我感到既无语又气愤!事件背景
事情的背景是这样的:我一个朋友今年年初创立了一家新公司。公司致力于开发一款社交类APP,希望能够为用户提供更好的社交体验。
手下有30多名员工,涵盖了技术、产品、运营和推广等多个领域。他主要负责公司的整体战略规划和日常经营管理,技术方面并不擅长。我们平时一直保持联系,我也会时不时地帮他处理一些技术上的问题,提供一些建议和帮助。事件经过
凌晨,我被电话,一看是我那位朋友打来的。语气很急,说他们公司的数据库服务器CPU占用率异常高,且持续不下。
他已经拉了微信群,后端Java的同事们都在,希望我能够协助诊断问题,尽快找到解决方案。
随后,我加入了那个微信群,开始深入了解问题的具体情况。
注:聊天内容已经获得授权公布。

他们后端Java把运维发的监控截图发出来了,咱继续跟他沟通。

为啥我说CPU占用高呢?大家看下他们运维发的图就知道了。

CPU已经飙升到了400%了,数据库服务器基本已经卡死。拿到他给我发的SQL后,我要了一份他们的数据库表结构,在我电脑上执行了下查询计划。

这不看不知道,一看吓一跳,一个C端频繁访问的接口SQL性能极差,Using temporary、Using filesort、Using join buffer、Block Nested Loop全出来了。
我把这个图发出去了,也结合他们团队的实际情况,给出了优化的目标建议:SQL中不要出现Using filesort、Block Nested Loop,尽量不要出现Using join buffer和Using temporary,把Using where尽量优化到Using Index级别。

说是尽量不要出现Using join buffer和Using temporary,把Using where尽量优化到Using Index级别,就是怕他们做不到这点,优先把Using filesort、Block Nested Loop优化掉。但是这货后面说的话实属把我震惊到了。

我看完他的回复,直接有点无语:卧槽,不超过500万rows效率很高?你这SQL 500万数据效果很高?更让我无语的是他说MySQL一般一亿以上数据量开始优化,这特么不是完全扯淡吗?
后面我就问他说的这些数据的依据是哪里来的。

他解释说这些是基于大数据高并发MySQL数据库压测得出的结论。然而,稍有压测经验的人都知道,压测的前提是要明确压测环境,包括服务器的CPU核数和内存等配置。他这种直接给出“MySQL一亿数据是大数据高并发MySQL数据库压测结果”的说法,显然是站不住脚的,更何况他还声称这是MySQL官方的数据。
或许是因为群里有老板在,他还在继续狡辩。

沟通到这里,我已经感到有些愤怒了。生产环境的业务几乎被数据库问题拖垮,CPU占用率爆表,慢SQL频现,而这些慢SQL的执行计划性能低下,无论是select部分还是where部分都大量使用了MySQL自带的函数,这无疑是导致性能问题的根源。
更让人愤怒的是他们对待问题的态度是如此轻率。
处理结果
后续我跟他们老板要了一个代码只读权限的账号,将代码拉取下来后,好家伙,到处都是这种SQL查询,要是一两处还好,把SQL修改并优化下,关联的业务逻辑调整下,再把功能测试下,接口压测下,没啥问题就可以发版上线了。
然而,令我感到棘手的是,这样的SQL查询语句在代码中随处可见。这意味着,优化这些SQL语句将需要投入相当多的时间和精力,甚至可能需要对新发布的重大功能逻辑进行重写。
因此,经过深思熟虑,我向他们的老板提出了建议:先将版本回滚到之前稳定的状态,暂时下线最新的功能。然后,我们集中精力对新功能的SQL语句、缓存机制、业务逻辑以及接口进行优化和调整,确保经过严格的压力测试没有问题后,再重新上线新功能。
事后总结
无论何时,一旦生产环境发生严重故障,首要任务便是迅速恢复其正常运作,确保服务的稳定可用。在此基础上,再深入排查问题根源,精准定位并解决,因为生产环境的每一秒停滞,都代表着巨大的经济损失。
搭建技术团队一定要找靠谱的人,最起码团队的核心人员要靠谱,像我朋友团队的这个技术,在他的认知里,MySQL执行计划出现Using temporary、Using filesort、Using join buffer、Block Nested Loop,500W rows效率都很高,殊不知他们生产环境实际主表数据才10几条,要是真达到500W量级就别查询了,数据库直接就趴下了。
还有这个MySQL一般一亿以上开始优化,这个依据我也不知道这是从哪里看到的,并且还说了大数据高并发MySQL数据库压测出来的,这不纯属扯淡吗?
这不禁让我深思:人的认知层次确实存在差异,有些人可能“不知道自己不知道”,有些人则“知道自己不知道”,还有人“知道自己知道”,而更高层次的则是“不知道自己知道”。这位技术人员或许就属于那种“不知道自己不知道”的人,缺乏自我认知和学习能力。
大家对这次事件有什么看法,欢迎评论区留言讨论。
*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。


更多精彩内容,关注我们▼▼
到顶部