根据不同的业务,优化的侧重点可能不一样,大体上可以归纳了如下一下方法,建议优化的时候要考虑成本问题,
最好是改动又少又快,效果还又好;改动越大越容易出各种问题。
大部分博文都没有提到硬件升级的方法,这种方法比较适合于短时间急需提高性能的场景,比如过明天马上有什么节日活动了,系统需要承受更高的请求量峰值,当其它简单的优化策略都用了,还达不到效果,紧急改代码增加缓存又有点仓促了,可以考虑买个更好的云服务器(内存、磁盘),租用个半个月一个月,顶一下峰值。
- 优化sql和索引;
- 调整mysql配置参数,参数若是读为主,索引已经创建的非常好,若是读为主,可以考虑打开query_cache,以及调整一些参数值:sort_buffer_size,read_buffer_size,read_rnd_buffer_size,join_buffer_size ;
- 升级硬件,更多的内存和更快的硬盘。如果是InnoDB引擎,多利用点内存,减轻磁盘IO负载,因为IO往往是数据库服务器的瓶颈;
- 读写分离,做主从复制,对主库进行增删改,对从库进行读,可以再应用层修改,也可以用第三方工具。由于Mysql主从复制是异步的,主从在同一时刻难免存在数据不一致的问题,特别是主从机器是跨机房或者跨地域,网络延迟大,数据很难保持强一致性。所以若是要求数据强一致性,这种方法就不合适。
- 增加缓存层,比如redis。需要修改应用层代码,读的时候先读cache,cache没有的话,再查数据库并回写cache;增删改时需要先删除cache的数据,再操作mysql,操作mysql成功后回写到cache,避免出现cache和mysql数据不一致的情况。
- 分区,mysql自带分区表,对应用是透明的,无需更改代码, 但是sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区;
- 水平分表(垂直分表需要根据具体的字段和业务分析,此处不考虑),需要修改应用代码,修改sql语句。分表的方法:比如通过日期进行分表(如交易订单表),每个月分成一张表,这个相对简单一点。或者通过账号ID(如用户信息表),算出一个hash值再取模N(N个表,这时候要注意,如果这N个表过阵子又涨到千万级别,可能又需要扩容到2*N个表,迁移数据是个麻烦事,所以N可以适当大一点)。