MySQL慢查询优化&缩容实践
索引调整
在一个数据量较大的订单表中,发现某些查询因为缺少合适的索引而变慢。添加了必要的索引后,查询效率明显提升。
查询条件调整
- 在一个sql中需要根据时间条件查询,但是等号左边的字段使用了函数操作(将时间戳转换成了年月日),导致索引失效进行了全表扫描。解决:将等号右边的条件反向转换成表里的字段类型。
- 一个统计报表的查询非常慢,原因是查询需要处理大量的数据。通过优化查询条件,只获取必要的数据,减少了数据的处理量,从而加快了查询速度。
分区处理
一个表中有大量的删除操作,后续将其按指定字段分区,定时drop分区
频繁调用的sql
与业务人员沟通,将其放入缓存
消除排序
将排序字段添加到索引上。(并不是所有都可以这样,要看具体的sql中排序字段所处的位置)
优化器没使用指定索引
通过explain analyze 去看一条语句执行时的信息统计,比较cost与actual time,再使用explain analyze force index去看使用指定索引的开销,确认是否没走合适的索引。
如果没走建立的指定索引,这是最难搞的,线上不允许使用optimize table,业务那边也不愿意使用force index。一般这种表的分析主要看
- 表的大小
- sql的频率
如果表比较小,则可以将其放到缓存中。或者等维护的时候清理表的碎片,但是需要提前克隆实例,测量操作时间。