数据分片

把数据按分片键拆分到多个节点,突破单机存储与写入上限;关键是分片键选择与再均衡方案,跨分片查询与事务的复杂度会明显上升。

数据分片是什么

数据分片把数据按分片键拆分到多个节点,突破单机存储与写入上限:写入压力打散到多台机器,单表规模下降带来更好的查询与维护表现。关键决策是分片键选择与再均衡方案,难点在于跨分片查询与事务的复杂度会明显上升。分片是最后手段之一,在读多写少的场景里,读写分离与索引优化往往能先撑住一段时间。

基本信息

分片键要求分布均匀且贴合高频查询条件
路由客户端路由或中间件路由,需维护分片映射关系
再均衡扩容时迁移分片,预分片可降低迁移成本
全局唯一主键需全局唯一方案,如雪花 ID 或分段号段
跨片代价跨分片查询需归并,跨分片事务需分布式方案

分片键选择参考

候选键优点风险
用户 ID分布均匀、查询可收敛到单片跨用户统计需汇总层
时间便于归档与冷热分离新数据集中到单一分片形成热点
业务域运维边界清晰、便于拆分各域规模不均,资源利用不平衡
复合键兼顾分布与查询模式路由逻辑更复杂,迁移更麻烦
哈希值分布最均匀范围查询无法收敛,需全片扫描

典型使用场景

  • 单表数据量过亿:索引深度与维护窗口都无法接受
  • 写入吞吐达上限:单实例磁盘与内存成为瓶颈
  • 多租户隔离:按租户分片,便于独立扩容与迁移
  • 冷热分离:按时间分片,把冷数据迁到低成本存储
  • 地域就近访问:按区域分片降低跨地域访问延迟
  • 大促削峰:写入分散到多个分片提升整体吞吐
分片数量要留出扩容空间:分片过少会导致单分片过大,后续迁移时间超出维护窗口;分片过多则元数据与连接数管理成本上升。
跨分片事务与聚合查询成本高;设计前先确认业务查询能否收敛到分片键边界内,否则分片只会把问题从单机搬到中间件。

易错点

  • 用自增 ID 做分片键,新数据持续集中到单一分片,热点问题依旧
  • 分片数量过少,扩容迁移时间超出维护窗口,业务被迫停机
  • 分片键与高频查询条件不一致,绝大多数查询需要扫描所有分片
  • 忽略全局唯一主键方案,分片后出现 ID 冲突或需要额外协调
  • 未规划再均衡方案,扩容只能停机导出导入,风险极高

数据来源与参考

  • 《数据密集型应用系统设计》(Kleppmann)第 6 章
  • MySQL 8.0 Reference Manual:Partitioning
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌