「这是我参与11月更文挑战的第 12 天,活动详情查看:2021最后一次更文挑战」
1、前言
在上一次的分享中,我们说到了如何来排查慢SQL以及常见的查询优化原则。本次我们继续分享下,数据库优化的具体策略。
2、缓存优化
缓存优化就是通过缓存SQL的执行结果,从而来提高查询速度与相应效率。当我们打开数据的的Query Cache功能时,数据库在执行Select语句后,会将加过放入QueryCache中,当下一次处理同样的select语句时,数据库就会从QueryCache中取结果集,而不要在从数据表中查询。(PS:这里因为QueryCache是放在内存中的,所以要比从硬盘中检索快得多。)但需要注意的是,一方面如果SQL语句的where条件有任何一丁点的变化,那么就不会命中缓存。同时,配置缓存后要注意服务器的压力,适当配置缓存大小。
3、读写分离
读写分离,顾名思义就是读与写操作分离,操作不同的数据库。在数据库读操作使用比较多的时候,为了避免写操作造成的性能影响,通常这种情况下就会采用读写分离的架构。读写分离的基本原理就是让主数据库处理事务的增删改操作,从数据库处理select操作。然后数据库间的复制被用来把事务性操作导致的变更同步到集群中的从数据库。在实际的应用中,笔者的公司是通过AOP配置不同的数据源,然后使用前置通知,实现读写操作对应的数据源。然后读写库之间的同步问题,这里并没有要求数据的强一致性,只需要保证数据最终正确完整即可。如果业务很复杂的话,还是推荐使用大公司的开源组件,比如说美团开源的MTDDL:MTDDL——美团点评分布式数据访问层中间件 - 美团技术团队 (meituan.com) 毕竟使用大公司的已经实际验证过的开源产品,更加可靠些。
4、分库分表
随着业务的扩大增长,当我们的数据量越来越大的时候,单体数据库就无法满足系统要求了。这个时候可以考虑进行分库分表操作。通常来说,有两种拆分方案:
1、垂直分库:根据业务来拆分,将业务进行细化,每一个小业务对应一个数据库。比如说:订单服务对应订单数据库,用户服务对应一个数据库等,实现专库专用,让业务更加的清晰,解耦合、可以针对不同的细分业务进行性能扩展优化、降低单机数据库的性能瓶颈;
2、水平分库:把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上。比如说将用户ID为奇数的放一个库里,为偶数的放另一个库中。
3、垂直分表:就是将一个表中的字段根据访问频率拆分成多个表。比如说,用户信息表,用户的昵称、性别等基本信息访问非常频繁,而用户的其他附属信息访问频率较低,我们就可以将其拆分成两张表。
4、水平分表:当单表的数据太多,我们就可以把这个表拆分成多个表。比如说订单表,我们可以将订单ID为奇数的单独放一张表里,订单ID为双数的独放在一张表中,从而避免IO竞争,及锁表的几率、优化单表数据量过大产生的性能问题。当然这里还是推荐大家使用MyCat来进行分库分表操作。