所有的项目的底层都会用到数据库,所以任何项目第一步必须要让数据库达到最好的性能;
- 数据库调优:给where条件的关键字段,或者
order by
后面的排序字段,加索引,避免select * 查询,尽量避免使用子查询转而用连表查询代替。 - 事务调优:项目应用中肯定会存在多个表联动的场景,这时候就会涉及使用事务,使用@Transactional注解这种声明式事务的方式提供事务功能,容易造成大事务,引发其他的问题。应该避免在事务中一次性处理太多数据,将一些跟事务无关的逻辑放到事务外面执行。
- 异步调优:往往项目都使用简单的单一主线程处理业务逻辑,这其实会导致咱们多核CPU大多时间很空闲,不能完美利用。所以要使用异步处理,剥离主逻辑和副逻辑,副逻辑可以异步执行,异步写库。
- 并发调优:在高并发场景中,为防止共享数据出现紊乱,我们最基本的解决办法就是加锁,但是加锁是最降低服务性能的操作,所以加锁一定要加颗粒的最小的锁,只锁住能够导致共享数据出错的地方,不要使用大规模的锁,这样能够最小程度的减少加锁对程序性能造成的影响。
- 缓存调优:如果表的数据量很大,又是频繁要使用的数据,我们不妨使用redis来做临时数据库,能非常快的提升系统性能。(曾有个朋友跟我说;业务中能用redis就用redis,用不了再用数据库,既然高铁都造出来为啥还要用绿皮火车。哈哈。我觉得他说的很多,新的好技术就要用,不要省着,redis比数据库更抗造。但是这也确实要正确使用redis,不能让redis泛滥...)
- 业务调优:例如最简单的业务查数据库,一定要避免在for循环中疯狂连接数据库查询数据库,我们可以把list中所有id变为参数进行一个批量查询。这样只需要连接一次数据库就能获取数据信息。(Java的处理速度可比数据库连接再查询数据不知道快了多少倍!)
- 分库分表。当系统发展到一定的阶段,用户并发量大,会有大量的数据库请求,需要占用大量的数据库连接,同时会带来磁盘IO的性能瓶颈问题。或者数据库表数据非常大,SQL查询即使走了索引,也很耗时。这时,可以通过分库分表解决。分库用于解决数据库连接资源不足问题,和磁盘IO的性能瓶颈问题。分表用于解决单表数据量太大,sql语句查询数据时,即使走了索引也非常耗时问题。
总结:其实所有的调优,无非就是在这一整个调用链路中让各个部分的性能发挥到最大,这就是调优。然而着重部分就是数据库部分,IO部分,CPU部分。