MySQL查询比较慢,有什么排查的思路?
答:
-
首先会想到是慢查询,先打开MySQL的慢查询的日志,收集一段时间的慢查询,然后找出耗时最长的几个慢查询SQL进行分析。
拿explain命令去看看这些sql语句有没有走索引。如果这个时候发现有的慢查询SQL没有走索引,然后尝试改造这些慢查询的sql走索引。
如果发现这些SQL没有办法被改造的时候,我们可以考虑在表上去添加索引,我们在改造SQL或者添加索引的时候都要符合最左前缀的规则。 -
在表比较大的时候,即使是sql语句走了这个索引,可能性能也不是很好,这个时候我们可以对表进行切分,表的切分主要分为2种,一种是水平切分,一种是垂直切分,水平切分就是把一个行数在千万级别的这个大表按照业务主键切分成100张或者1000张;垂直切分的话就是这张表里的列比较多,可以按照业务逻辑把相关的列切分到同一张表里面去。
-
除了分表之外的话我们还可以分库,比如说拆完了1000张表了,可以把后缀在0-100的表放在同一个MySQL实例里面,然后100-200的放到另一个MYSQL实例中里面,这样的话,我们就可以根据切分的业务主键,把请求路由到不同的MYSQL实例里面去,这样的话,每一个MYSQL实例承担的流量就会比较小,性能也会有所提高。
-
另一个角度可以进行读写分离,MYSQL是支持一主多从的这种分布式模式,主库只是用来处理写操作,然后从库的话呢用来处理读操作,在都流量比较大的场景中,我们可以考虑增加从库来扛这个流量,这样的话就可以提高mysql的一个性能。如果存在热点数据的话。除了MYSQL本身的改造之外,我们还可以考虑引入缓存,可以把热点数据放到缓存当中,通过缓存去缓解数据库的压力,从而提高MYSQL 的响应速度。
-
以上就是从索引、单表数据量、流量、热点数据几个角度去提高MYSQL性能的方法。
-
有其它更多的方法欢迎评论区补充留言。