数据拆分是大型架构的必备技能,下面我重点详解数据拆分@mikechen
1. 优先垂直拆分
通常先按业务模块做垂直拆分,明确不同功能域的数据库边界,再在热点表上做水平拆分。
垂直拆分能降低业务耦合,方便独立优化,直接水平拆分容易带来跨分片查询的复杂性。
优先根据业务模块与功能边界,进行垂直拆分。
比如:用户模块、订单模块、日志模块、统计模块,将不同生命周期与访问模式的数据放在不同库或表中。
2.再考虑水平拆分
当系统里的订单表数据量大,再做水平分片。
举一个例子,比如:社交平台用户表,采用 user_id 哈希到 16 个分片,每个分片一套数据库实例。
注意:需要全局唯一 ID 生成策略(如雪花算法)与分片路由层。
3.业务关联原则
在进行水平拆分时,需要尽量将业务关联性强的数据放在同一个分片中。
例如,在订单系统中,order_id
、order_item
、order_logistics
都是强关联的。
如果将它们放在同一个分片中,就可以在大部分查询场景下避免跨库 JOIN,从而大大提高查询效率。
4. 拆分规则必须稳定
分片键、分库分表规则一旦确定,不要轻易更改。
原因很简单,规则变更意味着需要迁移全部数据,成本极高且容易出错。
举一个例子,比如:按 user_id 哈希取模 16 个库,如果以后改成 32 个库,要重分布所有数据,风险极大。
建议,一开始可预留倍数(如 64 个逻辑分片),尽量预留大一点。
5. 避免数据热点
让数据尽量均匀地分布到各个分片,避免单库/单表成为性能瓶颈。
热点库/表会导致单点压力过大,即使有多分片也无用。
6. 减少跨分片事务
在设计时尽量避免一次操作,需要访问多个分片/数据库。
因为:跨库事务需要分布式事务(如 2PC、XA),性能开销大且实现复杂。
跨库 Join 会导致全量扫描和聚合,性能急剧下降。