分库分表背景
数据分片: 将存放在单一数据库中的数据,按照某一维度分散地存放至多个数据库或者表中。
达到提升性能瓶颈,以及可用性的效果。
**分库:**分库能够用于有效的分散对数据库单点的访问。
**分表:**分表虽然无法缓解数据库压力,但却能够提供尽量将分布式事务转化为本地事务的可能,一旦涉及跨库的更新操作,分布式事务往往会使问题变复杂。
**多主多从:**使用多主多从的分片方式,可以有效的避免数据单点,从而提升数据架构的可用性。
分库
-
垂直分库
在拆分之前,一个数据库是由多个表构成,每个表对应不同业务;拆分之后,会按照业务对数据的需求对数据进行归类,分不到不同的数据库中,从而将压力分散至不同的数据库。
优点:
- 可以针对不同业务场景优化数据库,提高性能。
- 提高了数据库的并发能力。
缺点:
- 需要处理分布式事务的问题。
- 增加了系统的复杂度。
-
水平分库
相对于垂直分片,它不再将数据根据业务逻辑进行分片,二十通过某个或多个“字段”,根据某种规则将数据分散至多个库或者表中,每个分片仅包含数据的一部分。 例如:根据主键分片,偶数主键的记录放入 0 库(或表),奇数主键的记录放入 1 库(或表)。
优点:
- 提高了单库的读写性能,降低了单库数据量。
- 可以将库存储在不同的物理服务器上,提高了查询效率。
缺点:
- 需要处理跨库查询的问题。
- 对分库规则的设计需要谨慎,避免热点数据集中在某个库中。
分表
-
垂直分表
同垂直分库的原理,维度变成表。
优点:
- 拆分后每个表的数据量变小,查询时涉及的磁盘 I/O 次数相对减少,提高了查询效率。
- 每个小表的并发写入操作相对较少,减少了数据库锁的竞争,提高了并发能力。
缺点:
- 需要在应用层面处理跨表查询的逻辑,增加了开发的复杂性。
- 如果一个事务涉及多个小表,可能需要在应用层面进行事务管理,增加了代码的复杂性。
- 需要额外的措施来保证拆分后的小表之间的数据一致性。
-
水平分表
同水平分库的原理,维度变成表。
优点:
- 可以根据数据量的增长动态地增加分表,从而扩展数据库的存储能力。
- 每个小表的数据量减少,可以提高查询速度,尤其是在频繁查询的场景下。
- 拆分后,每个小表的并发写入操作相对减少,降低了数据库锁的竞争,提高了并发性能。
缺点:
-
对业务存在一定限制,如果没有按照分片键查询,会造成读扩散问题。
“读扩散:大部分情况我们都使用主键id作为分片键,理想情况下,我们根据id可以很快的定位该读哪个表,但是多数情况下我们查询的不是主键,而是普通字段,由于不是分片键,我们没办法定位到具体的分表,于是就会对所有分表都执行一次SQL,随着分表越来越多,次数也越来越多,这就是读扩散问题。”
-
对分表规则的设计需要谨慎,避免热点数据集中在某个表中。