简介
对于任何系统而言,都会设计到数据库随着时间增长而累积越来越多的数据,系统也因为越来越多的需求变迁导致原有的设计不再满足现状,为了解决这些问题,分库分表就会走进视野,带着几个问题走入分库分表。
- 什么是分库分表
- 为什么要分库分表
- 怎样分库分表
- 分库分表后如何处理事务问题
什么是分库分表
分库分表是一种技术方案,为了解决单机数据块随着时间增长,数据量越来越大引起的数据库性能逐渐下滑。
在上述定义中,分库分表主要是为了解决数据库性能下降产生的一种技术方案。
引起数据库性能下降的原因有很多,但不一定都需要通过分库分表来解决。分库分表主要是为了解决单机数据量过大。
为什么分库分表
根据上述介绍,当数据量过大时,单机数据库无法进一步优化,只能通过分库分表方案来分散数据。
如果是其他原因,是可以通过优化手段来解决的,比如索引失效,可以通过合理索引的创建来提升数据库性能。只有数据量不断增大时,所有手段都已经用了,也无法进一步优化,这时只能通过分库分表来解决。
如何分库分表
分库和分表是两个维度的方案,库由表组成,表的粒度比库更小,它们都涉及到拆分。
表是一个由行和列构成的二维结构,因此拆分时可以分为列拆分和行拆分,它们也叫做垂直拆分和水平拆分。
1. 垂直分库分表
垂直拆分的原理和单体系统拆分为微服务同理
1. 按业务垂直拆分。将业务按照一定的粒度划分,然后将相同业务范围的数据拆分到一起,形成内聚。
2. 按字段使用频率拆分,将高频字段和低频字段拆分。
3. 按字段读写频率拆分
4. 等等
一、垂直分库
垂直分库是按较大粒度进行业务拆分,将原有的单体库拆分多个业务板块的数据库。
二、垂直分表
垂直分表,则是将原有的单表,按列拆分为多个表。其拆分原则也是按业务拆分,将原有的大表拆分为几个小表。
2. 水平分库分表
数据库的数据由行组成,水平分库分表则是按数据量拆分。将原有的大库或大表拆分为多个子库或子表。
如何让数据存入不同的子表?
1. 分散存储, 让数据循环存入子表A、B、C
2. 范围存储, 分段类似0-1000万存A表,1000万-2000万存B表。
分库分表后如何处理事务问题
无论水平拆分,还是垂直拆分,都会涉及到分布式事务问题。
分布式事务目前的解决方案主要是阿里巴巴开源的Seata分布式事务中间件。