一、调优重点之开发规范与索引
- 回表对效率影响很大,尽量使用覆盖索引
- 考虑是否组件联合索引,并需要遵守最左匹配原则
- 对索引进行函数操作或表达式计算会导致索引失效
- 利用explain查看索引使用情况,是否走索引。通过show profile查看资源损耗情况
- 尽量减少锁持有时间,比如一个事务进行插入&&更新操作,则先插入再更新,因为更新需要持有锁
- 利用子查询优化多分页场景。比如limit offset,需要先获取offset+n的记录,再返回n条。 子查询则是先查出n条,再通过ID检索出对应记录
二、调优重点之解决线上慢查询
- 一般为数据量太大,可以考虑删掉旧的数据,但不太会删
- mysql查询前加一层redis,但需要能够忍受数据时效性差的问题
- 再考虑是否有字符串检索场景导致查询效率低下,是的话能引入elasticsearch
- 如果还是不行的话,考虑根据查询条件的维度,做相应的聚合表,线上的请求就查询聚合表的数据,比如用户下单,产生的订单明细表的量级太大,前台的查询功能是以天维度展示,故将用户每天的数据聚合起来,这样聚合表就是一个用户一天只有一天汇总后的数据
三、写性能同样有瓶颈怎么办?
- 将架构升级为主从架构,主服务器接收写请求,从服务器接收读请求
- 从服务器通过主服务器给予的binlog来实现主从数据一致
- 若还是觉得效率低的话,得考虑分库分表
- 分库分表后的ID通过redis自增或雪花算法自增
四、分库分表的迁移过程是怎么样的?
采用双写
- 新增消息各自往新表和旧表写一份
- 将旧表的数据迁移至新库
- 迟早新表的数据追上旧表
- 校验新表和老表得到数据是否正常
- 开启双读(一部分流量走新表,一部分老表),即灰度上线
- 读流量全切新表,停止老表的写入