数据库常见面试题:如何排查线上慢SQL的原因
做开发的小伙伴们肯定都知道,性能问题贯穿了整个开发过程,躲都躲不掉。不管是代码审查,还是性能审查,总能揪出各种各样的问题。就算代码顺利通过审查,到了线上环境,还是会出现用户访问慢、接口响应超时、页面加载失败这些让人头疼的性能问题。在众多问题里,慢SQL特别突出,很多性能专案都得分析它带来的麻烦。今天咱就好好唠唠线上慢SQL产生的原因,这也是数据库面试里的常见考点,建议大家点赞收藏。
索引没用好,全表扫描拖后腿
很多时候,慢SQL是因为没加索引,或者加了索引却没起作用。索引这玩意儿就像是图书馆的目录,能帮数据库快速定位到想要的数据。要是索引没命中,数据库就只能像没头苍蝇一样,进行全表扫描,把表里的数据一条一条找出来。要是库里的数据量特别大,那扫描的时间可就长了去了,查询速度自然快不起来。
所以,日常开发的时候,一定要记得给经常查询的字段加上索引。加完索引也不能掉以轻心,还得检查索引有没有失效。像在索引列上使用计算函数,就好比给目录乱加了些奇怪的标记,数据库就很难通过它快速定位数据了;联合索引要是不符合最左匹配原则,就像按目录找书,从中间开始找,肯定找不到;不恰当的模糊搜索、范围检索也会让索引失效。这几个情况都得注意,别让辛苦加的索引白费力气。
多表关联太复杂,查询速度受影响
多表关联查询也是导致慢SQL的常见原因。我见过最夸张的,有十几张表一起关联查询。哪怕每张表的索引都命中了,可数据量一大,扫描的行数还是多得吓人,SQL执行速度照样快不起来。一般来说,超过3个表进行join操作的时候,就得小心了,最好把它拆分成多个查询。这就是用空间换时间的思路,虽然可能会占用更多的存储空间,但能大大提高查询效率。
行锁、表锁惹祸,操作只能干等着
行锁和表锁也会让SQL变慢。表锁就是把整个表都锁住了,这时候其他用户想操作表里的数据,就只能干等着锁释放。要是锁的时间太长,整个系统都可能崩溃。为了避免这种情况,线上一般都会有监听程序,时刻盯着有没有锁表的情况发生。
行锁通常是事务阻塞导致的。比如说,一个事务把某条记录锁住了,另一个事务想修改这条记录,就只能等着,要是不能及时释放锁,这个SQL就会变得很慢。
其他因素别忽视,也会让SQL变慢
要是索引命中了,也没有多表关联,也没遇到锁的问题,可查询还是慢,这就得从其他方面找找原因了。比如说各个中间件之间有没有网络延迟,要是网络不给力,数据传输就会慢;查询的内容是不是太多了,内容太多处理起来自然就费时间;每次查询是不是都要回表,回表操作多了也会影响查询速度。这些因素都有可能导致慢SQL,排查问题的时候可别漏了。
今天关于线上慢SQL原因分析就到这儿了。要是大家对这内容还有啥疑问,欢迎在评论区留言,咱们一起讨论!要是觉得这篇文章有用,别忘了分享给身边搞开发的小伙伴。