【MySQL篇10】:四种分库分表详解
文章目录
- 分库分表:应对海量数据量
- 1. 垂直分库
- 2. 垂直分表
- 3. 水平分库
- 4. 水平分表
- 总结分库分表策略
分库分表:应对海量数据量
随着业务的发展,单个数据库实例或单张表的数据量可能会变得非常庞大,导致查询性能下降、写入压力增大、维护困难等问题为了解决这些问题,我们需要采用分库分表 (Sharding) 的技术
分库分表的核心思想是将一个大型数据库或表的数据分散到多个较小、更易于管理的数据库或表中这样可以有效地降低单个数据库或表的负载,提高整体系统的吞吐量和可扩展性
分库分表主要有两种策略:垂直分库分表 和 水平分库分表
1. 垂直分库
- 定义: 垂直分库是根据业务功能或模块将不同的表分散到不同的数据库中简单来说,就是将原本在一个数据库中的不同业务的表,分别放到各自独立的数据库中
- 类比: 想象一下你有一个大仓库,里面存放着各种各样的物品:食品、服装、电子产品等等垂直分库就像是你在仓库里划分出不同的区域,一个区域专门存放食品,一个区域专门存放服装,一个区域专门存放电子产品
- 优点:
- 职责清晰: 每个数据库负责一个独立的业务模块,方便管理和维护
- 隔离性好: 不同业务之间的数据库相互独立,互不影响,提高了系统的稳定性和可用性
- 易于扩展: 可以根据不同业务的需求独立扩展数据库资源
- 缺点:
- 跨库 Join 困难: 如果需要跨越不同数据库进行 JOIN 操作,会比较复杂,通常需要通过应用层进行关联查询或数据冗余
- 事务管理复杂: 跨库事务需要分布式事务支持,增加了复杂性
- 适用场景: 适用于业务模块划分清晰,不同模块之间关联较少的情况;对于微服务架构,每个微服务对应一个数据库,是根据业务进行拆分的,这个其实就是垂直拆分
2. 垂直分表
- 定义: 垂直分表是将一张表的列按照其重要性或访问频率进行拆分,将不经常访问或字段较多的列拆分到单独的表中
- 类比: 想象一下你的身份证信息,上面有很多字段:姓名、性别、出生日期、住址、民族等等垂直分表就像是将身份证上的信息拆分成两部分:一部分是经常需要用到的核心信息(姓名、性别),另一部分是不经常用到的详细信息(住址、民族)
- 优点:
- 提高查询效率: 经常访问的字段放在一起,可以减少磁盘 I/O,提高查询速度
- 减少数据冗余: 可以避免在主表中存储大量不常用字段
- 缺点:
- Join 操作: 查询完整数据时需要进行 JOIN 操作,可能会增加一些开销
- 维护复杂: 需要同时维护多张表
- 适用场景: 适用于单张表字段过多,且部分字段访问频率较低的情况
3. 水平分库
- 定义: 水平分库是根据某种规则(如用户 ID、订单号等)将一张表的数据分散到多个数据库中的多张表中每个数据库中的表结构是相同的,只是存储的数据范围不同
- 类比: 想象一下你有一个巨大的图书馆,里面有很多书水平分库就像是你在不同的城市建立了多个图书馆,每个图书馆都存放一部分书,但每个图书馆的内部结构(书架、分类等)是相同的你可以根据书名的首字母或者作者来决定这本书应该放在哪个城市的图书馆
- 优点:
- 突破单库容量限制: 可以存储海量数据,突破单个数据库的存储容量限制
- 提高并发能力: 读写请求可以分散到多个数据库,提高了系统的并发处理能力
- 易于扩展: 可以根据数据量的增长增加数据库节点
- 缺点:
- 分片规则复杂: 需要设计合理的分片规则,否则可能导致数据分布不均匀
- 跨库查询复杂: 跨越多个数据库进行查询需要分布式查询支持
- 维护和管理复杂: 需要管理多个数据库实例
- 适用场景: 适用于数据量巨大,需要突破单库容量限制的情况
4. 水平分表
- 定义: 水平分表是根据某种规则(如用户 ID、订单号等)将一张表的数据分散到同一个数据库中的多张表中每个表结构是相同的,只是存储的数据范围不同
- 举例: 对于类似历史(积分)排行榜一类的表,就可以按照月份、赛季等进行水平拆分,加快查询效率,需要查询某个月份、赛季排行,直接拼接含有月份、赛季信息排行的表名(分表表名一般与分表依据有关),到专属的分表中查询即可
- 优点:
- 提高查询效率: 查询时只需要在部分表中进行扫描,减少了扫描范围
- 提高并发能力: 读写请求可以分散到多个表中,提高了表的并发处理能力
- 缺点:
- 分片规则复杂: 需要设计合理的分片规则
- 跨表查询复杂: 跨越多个表进行查询需要分布式查询支持
- 适用场景: 适用于单张表数据量巨大,但单个数据库容量尚可,主要想提高单表性能的情况
总结分库分表策略
策略 | 拆分维度 | 拆分对象 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|---|
垂直分库 | 业务功能 | 数据库 | 职责清晰,隔离性好,易于扩展 | 跨库 Join/事务复杂 | 业务模块划分清晰,关联较少 |
垂直分表 | 字段 | 表 | 提高查询效率,减少数据冗余 | Join 操作,维护复杂 | 单表字段多,部分字段访问频率低 |
水平分库 | 数据行 | 数据库 | 突破单库容量限制,提高并发能力,易于扩展 | 分片规则/跨库查询/维护复杂 | 数据量巨大,需要突破单库容量限制 |
水平分表 | 数据行 | 表 | 提高查询效率,提高并发能力 | 分片规则/跨表查询复杂 | 单表数据量巨大,但单库容量尚可,提高单表性能 |
通常情况下,实际应用中会结合使用 垂直分库 和 水平分库分表 策略,根据具体的业务场景和数据量来选择最合适的分片方案