分库分表是怎么分的?
分库分表主要是有水平拆分和垂直拆分,具体又分为分库和分表:
水平拆分
水平拆分又包含水平分库和水平分表。
水平分库:
- 水平分库指的就是把把一个表中的数据根据分片策略分派到不同服务器上,每个库存储部分数据,所以库的数据之和才是全量数据。简单来说就是把数据进行拆分,一个地方放一点数据。水平分库的策略有很多,例如可以根据id进行范围分片,或者取模分片,或者枚举分片,日期分片或者自然月分片等等,水平分库用得很多。
- 适用场景:
- 单库数据量过大,磁盘或性能达到瓶颈。
- 高并发读写,需分散压力。
- 优点:
- 数据分散存储,降低单库负载。
- 支持水平扩展,提升并发能力。
- 缺点:
- 跨库查询需聚合结果,复杂度高。
- 分布式事务处理复杂。
- 适用场景:
水平分表:
- 水平分表指的是把一个表中的数据拆分到几个表中,比如【1<id<=100万】的数据分到table1,【100万<id<=200万】的数据分到table2,【200万<id<=300万】的数据分到table3,所有表合起来的数据才是完整的全量数据。
- 适用场景:
- 单表数据量过大,影响查询效率。
- 无需跨库事务,但需分散单表压力。
- 优点:
- 减少单表数据量,提升查询性能。
- 避免单表锁竞争。
- 缺点:
- 需修改 SQL 语句指定表名(如
table${id%4}
)。 - 分表后仍需处理单库性能瓶颈。
- 需修改 SQL 语句指定表名(如
- 适用场景:
垂直拆分
垂直拆分又包含垂直分库和垂直分表。
垂直分库:
- 垂直分库是按业务把数据库中的表拆分到不同的库当中,比如有10个表,其中需要分到3个服务器上,可以根据业务把4个表分到服务器1上,3个分到服务器2上,另外3个分到服务器3上。注意,这里并不是说垂直分库就是要平均分的意思,而是要尽可能根据业务进行均衡的分片,把数据均衡分配到多台服务器上。
- 适用场景:
- 业务模块耦合度低,需独立管理。
- 不同业务数据量差异大,需资源隔离。
- 优点:
- 业务解耦,提升系统可维护性。
- 按业务分配资源,优化硬件使用。
- 缺点:
- 跨库 JOIN 需应用层处理。
- 分布式事务管理复杂。
- 适用场景:
垂直分表:
- 垂直分表就是把一个表里的字段进行拆分,例如一个表很庞大,有100个字段,这时候可以考虑把其中一部分字段拿出来新建一个表,通过id进行关联即可,一般是把高频访问的字段和低频字段分开,提高查询效率。
- 适用场景:
- 单表字段过多,存在大字段(如 BLOB、TEXT)。
- 高频查询仅需部分字段。
- 优点:
- 减少单表宽度,提升查询效率。
- 分离冷热数据,优化存储。
- 缺点:
- 查询需多次 JOIN 或应用层合并数据。
- 事务一致性需额外处理。
- 适用场景:
四者的核心区别对比
拆分层次 | 库级别 | 表级别 | 库级别 | 表级别 |
拆分方式 | 按行分布到不同库 | 按行分布到同库不同表 | 按业务模块分布到不同库 | 按字段分布到不同表 |
主要目标 | 解决单库容量和性能瓶颈 | 解决单表数据量过大问题 | 业务解耦与资源隔离 | 优化单表结构,提升查询效率 |
数据分布 | 数据行分散到多个库 | 数据行分散到多个表 | 不同表分散到多个库 | 表字段分散到多个表 |
典型场景 | 高并发电商订单表 | 用户表按ID哈希分表 | 用户、订单、商品独立成库 | 用户基础信息与详情分离 |
事务处理 | 跨库事务复杂 | 单库事务简单 | 跨库事务复杂 | 单库事务简单 |
查询影响 | 跨库查询需聚合 | 需路由到具体表 | 跨库 JOIN 困难 | 需多次查询或 JOIN |
扩展性 | 支持动态扩容 | 库内扩展有限 | 按业务扩展库 | 表结构固定,扩展性低 |