慢SQL定义
慢SQL的话,一般超过1s就属于慢SQL,超过1秒的SQL,大部分都是连表比较多了,比如left join,right join,inner join这些,因为是多个表,所以树构建的都不一样,所以连表性能比较差。
排查慢SQL
这里有两种情况,一种是没锁定到慢SQL,一种是锁定到了慢SQL。
那如果没锁定到慢SQL的情况下,一般会先开启,慢日志,mysql可以支持配置的,这个慢日志可以,配置一个预值,这个预值一般就是1秒,也就是说,mysql里面会进行监听,如果超过了1秒,他就会把他的那个,日志打印下来,打印下来的是一个一个的SQL,然后就可以通过,explain关键字,来具体来看,这个SQL慢的原因。这个是没锁定到慢SQL的情况。
然后接着说,直接锁定到慢SQL的情况,锁定到SQL以后,用explain关键字看,SQL慢的原因,看他的那个type,看他的index,看他的rows,就是对应扫描多少行,对应命中的索引,来判断是索引失效呢,还是没加索引。
基本上来说,分为两种情况:
一个是Java代码本身,或者说是SQL的编写有问题,不规范,导致索引失效。就比如说:违背了最左原则,还有就是有索引,但是你没用,就比如说查询时候有一个name的字段,他加了一个唯一索引,但是查询时候,没用这个name,查询场景用不到,这种就是不行的,还有就是在那个,索引上进行隐式计算(比如说在索引上搞一个+=,这种会让索引失效),和in、not in(这个有可能不走索引,因为走索引查一页数据是16k,数据量少的话有可能不走索引)一般推荐用exist(一个z斯特)或者not exist来替代,大概就是这些。(in和exist的区别的话,我只记得exist是避免索引失效的)
另外一个就是索引,索引导致的慢查询的话,有可能是没索引,解决的话就加索引,用那个explain关键字查看执行计划。
还有一种情况是,有索引,但是没走索引,解决的花也是用explain关键字查看执行计划。