老系统优化方案

发布时间 2023-03-22 21:16:23作者: sun-sailing

  前言:接手一个老系统,我们可以从哪些方面去思考如何优化呢?

  参考链接:常见性能优化策略的总结,作者:美团技术团队

 

  首先,需要了解项目背景,以及优化诉求; 再次,分析问题所在代码,画出业务流程图;最后选择合适的优化方案:代码(算法)、数据库调优、SQL语句调优、缓存、异步、JVM调优、多线程和分布式。详细分解如正文所示。

 

1、关于老系统的背景说明

1.1 了解老系统的前世今生,以及中间关键节点信息。

1.2 客户诉求是哪些方面,通过分析客户诉求,还能够发现哪些可以优化的方面。

2、现状分析

  分析需要优化的业务,确定执行条件,以及执行结果,方便优化后对比。以及输出业务流程图,相关源码分析。

3、优化方案

3.1 算法优化

  3.1.1圈复杂度,目标不超过10

  3.1.2时间复杂度,O(1)\O(logN)\O(n)\O(nlogN)\O(n²)

  3.1.3空间复杂度,O(1)\O(n)

3.2 数据库调优  

  3.2.1 Sql调优

  自带的慢查询日志或者开源的慢查询系统定位到具体的出问题的SQL,然后使用explain、profile等工具来逐步调优,查询慢查询sql语句。摘录部分如下:

  (1)创建索引,避免全表扫描

  (2)避免在索引上使用计算,in和exists使用exists

  (3)调整where字句中的连接顺序,过滤最大数量记录条件排前,依次往后

  (4)减少调用sql次数,压缩到一句sql中

  (5)用union all替换union(去重动作),(笛卡尔积)

  (6)考虑使用“临时表”暂存中间结果

  (7)问题笛卡尔积过大,解决方式去掉重复数据

  3.2.2 连接数调优:连接数量范围[100,16384],最大连接数占比合理范围为[10%,85%]。

  3.2.3连接池调优,当前使用的Druid连接池

  3.2.4 数据库表设计优化:大字段垂直分拆;水平分拆;表设计优化

3.3 缓存服务

  (1)短时间内相同数据重复查询多次且数据更新不频繁,这个时候可以选择先从缓存查询,查询不到再从数据库加载并回设到缓存的方式。此种场景较适合用单机缓存。

  (2)高并发查询热点数据,后端数据库不堪重负,可以用缓存来扛。

3.4 异步

  针对某些客户端的请求,在服务端可能需要针对这些请求做一些附属的事情,这些事情其实用户并不关心或者用户不需要立即拿到这些事情的处理结果,这种情况就比较适合用异步的方式处理这些事情。

3.5 替换mysql为NoSql或greenplum,即更加高效的DB

3.6 JVM性能调优

3.7 服务器扩容