分库分表的定义
分库分表是一种数据库优化技术,用于解决单库单表性能瓶颈的问题。当数据量过大或并发访问压力过高时,将原本集中存储的数据分散到多个数据库或多个表中,从而提升数据库的性能、扩展性和可用性。
- 典型场景:电商订单表、社交平台用户信息表等海量数据业务。
- 核心目标:
- 降低单库/表的数据量(减少磁盘IO和内存压力)。
- 提高查询和写入效率(并行处理)。
- 支持水平扩展(动态增加数据库或表)。
分库分表的类型(策略)
1. 按拆分维度分类
(1)垂直分库
- 定义:按业务模块将不同表分散到不同数据库中。
- 示例:电商系统中,将用户模块(用户表、地址表)拆到“用户库”,订单模块(订单表、支付表)拆到“订单库”。
- 优势:
- 物理隔离业务模块,减少跨库依赖。
- 突破单机硬件限制(如磁盘容量、连接数)。
- 适用场景:
- 表之间关联性低,但数据量大的场景(如用户中心与订单中心分离)。
(2)垂直分表
- 定义:按字段(列)将一张表拆分为多个子表,通常根据字段的访问频次或属性。
- 示例:订单表中,高频访问的字段(订单号、价格)存入“订单基础表”,低频字段(物流备注)存入“订单扩展表”。
- 优势:
- 减少单表字段宽度,提升热点数据访问效率。
- 优化数据库行加载性能(减少磁盘IO)。
- 不足:
- 需要多表关联查询,增加SQL复杂度。
- 适用场景:
- 表字段多且冷热数据差异大的场景(如用户信息表包含冗余字段)。
(3)水平分库
- 定义:将同一张表的数据分散到多个数据库实例中(物理隔离)。
- 示例:订单表按用户ID取模,分散到
db_0
、db_1
两个数据库。
- 示例:订单表按用户ID取模,分散到
- 优势:
- 突破单库硬件限制(如连接数、磁盘容量)。
- 支持高并发写入(负载均衡到多个库)。
- 适用场景:
- 单表数据量极大且需要横向扩展的场景(如社交平台的消息记录)。
(4)水平分表
- 定义:将同一张表的数据按规则拆分成多个表(逻辑上是同一张表)。
- 示例:订单表按用户ID取模拆分为
order_0
、order_1
四个表。
- 示例:订单表按用户ID取模拆分为
- 优势:
- 降低单表数据量,提升查询性能(减少全表扫描)。
- 支持灵活的分片策略(如时间分表、哈希分表)。
- 适用场景:
- 单表数据量超过千万级的场景(如日志系统、交易记录)。
2. 按组合策略分类
(1)垂直+水平分库分表
- 定义:先按业务模块垂直分库,再在每个库内按规则水平分表。
- 示例:
- 垂直分库:用户库、订单库、商品库。
- 水平分表:订单库中按用户ID分表(
order_0
、order_1
)。
- 示例:
- 优势:
- 兼顾业务隔离和数据分散的灵活性。
- 适用场景:
- 复杂业务系统(如电商平台需同时处理用户、订单、商品)。
(2)混合分库分表
- 定义:结合垂直分表和水平分库/分表策略。
- 示例:
- 垂直分表:用户表拆分为
user_base
(基础信息)和user_detail
(详细信息)。 - 水平分库:
user_base
按地域分库(华北库、华东库)。
- 垂直分表:用户表拆分为
- 示例:
分库分表的常见策略
策略类型 | 分片规则 | 优点 | 缺点 |
---|---|---|---|
哈希分片 | 按分片键哈希值分配(如 user_id % N ) | 数据分布均匀,路由简单 | 扩容时需迁移数据 |
范围分片 | 按分片键范围划分(如时间范围、ID区间) | 扩容方便,支持范围查询 | 数据分布可能不均(如热点问题) |
一致性哈希 | 使用一致性哈希算法 | 扩容时数据迁移少 | 实现复杂 |
时间分片 | 按时间单位(年/月/日)分表 | 适合日志类数据归档 | 历史数据查询需跨表 |
列表分片 | 按枚举值划分(如城市、业务类型) | 业务逻辑清晰 | 分片键固定,扩展性差 |
分库分表的核心问题
- 数据一致性:跨库事务需分布式事务框架(如 Seata、TCC)。
- 分片键设计:选择高频查询字段,避免数据倾斜。
- 扩容迁移:需双写策略或增量同步工具(如 Canal)。
- 跨分片查询:避免跨库JOIN,或使用中间件(如 ShardingSphere)。
- 运维复杂度:需监控分片负载、数据分布及故障恢复。
总结
- 分库分表是应对大数据量和高并发的核心手段,需根据业务特点选择策略(如垂直/水平分库分表)。
- 关键点:合理设计分片键、平衡读写性能、处理分布式事务、规划扩容方案。
- 工具支持:可借助中间件(如 ShardingSphere、MyCAT)简化开发和运维。
THE END