数据库优化方案
概述
在一个系统中,服务层往往被设计成无状态的模式,可以自由水平扩容来提升 QPS,但是再提升的同时数据库的要求也会升高,此时往往数据库才会变成制约性能的瓶颈。
另外的对于查询来说,单表的查询效率会随着表中数据量的增加而降低。
数据库优化的方案有如下几种:
- 分表分库
- 读写分离
分表分库
何时需要分表?
在数据量过大已经造成接口和事务执行缓慢的时候就应该考虑分表。(MySQL InnoDB 的配置下推荐 1500w 以上数据就开始考虑。
垂直拆分
垂直拆分是根据数据的业务相关性进行拆分。
在分库逻辑中,可以将多个表分到不同的库,而在分表逻辑中可以将不同的字段拆到不同的表。
垂直拆分可以使数据按照业务各类,让数据更加清楚纯粹,但是垂直拆分无法处理单个业务领域的数据暴增问题。
水平拆分
水平拆分就是将同样的表结构或者库结构创建多份,而将请求分散到这些库或者表中。
水平拆分涉及的分片方式通常有如下几种:
- Hash 分片
- 范围分片
分表分库的方式
分表分库的方式可以分为以下三种:
- 客户端分片
- 代理服务器分片
- 分布式数据库
ShardingSphere 就是属于客户端分片的实现,使用该类实现需要额外在项目中配置分片规则。
例如 ShardingSphere 中就需要选择分片键然后根据分片键进行 Hash,需要实现 In / Equel / Between 三种形式的 SQL 分片。
框架本身在分析了 SQL 的执行目标之后,将 SQL 中的虚拟表名替换为真实表名,从而进行分表。