分库分表原理与实践
大约 2 分钟
分库分表原理与实践
分库分表是应对大数据量、高并发场景下数据库性能瓶颈的常用架构手段。
定义
- 分库:将数据按某种规则分散存储到多个数据库实例中。
- 分表:将单表数据按某种规则拆分到多个物理表中。
常见问题
- 跨库/跨表查询复杂
- 分布式事务难以保证强一致性
- 主键全局唯一性设计
- 数据迁移与扩容
应用场景
- 电商、社交、金融等大规模数据系统
- 订单、日志、用户等大表
数据倾斜问题
数据倾斜是指某些分片(库/表)上的数据量或访问量远高于其他分片,导致部分节点压力过大,影响整体性能和可用性。
成因
- 分片键选择不合理,导致数据分布不均
- 部分业务天然存在“超级用户”或“热点ID”
解决方案
- 优化分片键设计,选择高区分度字段
- 对热点数据单独拆分或做特殊处理(如热点库/表、缓存)
- 动态迁移数据,定期重分片
热点数据问题
热点数据是指被频繁访问或更新的少量数据,容易成为系统瓶颈。
成因
- 某些用户、商品、话题等访问量极高
- 活动期间产生的流量集中
解决方案
- 引入缓存(如 Redis)缓解数据库压力
- 热点数据单独存储或分库
- 采用异步写入、削峰填谷等手段
读扩散问题
读扩散是指一次查询需要访问多个分库分表,导致查询效率下降,甚至带来网络和资源消耗的激增。
成因
- 需要聚合多分片数据(如全局统计、跨表分页)
- 业务查询未能局部化
解决方案
- 业务层限制跨分片查询,尽量单分片操作
- 预聚合、冗余存储、引入中间汇总表
- 利用分布式中间件(如 ShardingSphere、Mycat)优化路由和聚合