
分库分表需基于业务逻辑选择分片键(如订单ID哈希、库存商品ID范围),通过哈希/范围分片实现数据水平扩展,用复合分片键或虚拟键解决数据倾斜,跨库事务采用分布式事务框架(如Seata AT模式)保证一致性,同时配置读写分离提升性能,并设计动态调整机制应对库表数量变化。
分库分表的核心是“分片键”作为数据路由依据,将大表拆分为多个小表实现水平扩展。
(简短类比:分片键是“货物分类规则”,数据倾斜是“某个小仓库堆满货物”,跨库事务是“多个小仓库同时操作货物需同步”。)
| 分片方式 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 哈希分片 | 根据分片键的哈希值取模,均匀分布数据 | 数据分布均匀,等概率访问 | 订单ID、用户ID等无序数据,访问概率均等 | 需全局唯一ID,热点数据可能集中(需复合键) |
| 范围分片 | 根据分片键的区间(如时间、ID范围)划分 | 数据有序,适合时间序列或有序数据 | 库存表按商品ID范围、订单表按下单时间范围 | 热点数据可能集中在某个区间(需虚拟键) |
假设订单表order_table(字段:order_id、user_id、order_time),库存表stock_table(字段:product_id、stock_num、product_name)。
order_id的哈希值(取模库表数量,如库表数4,order_id % 4)分片到order_table_0/order_table_1等;product_id区间(如0-1000为库表0,1001-2000为库表1)分片。order_id % 8,迁移数据到新库表(如order_table_4等),通过中间件路由规则更新。(伪代码示例:插入订单时,计算分片键,路由到对应库表;扣减库存时,通过分布式事务协调器同步操作。)
“针对南光集团贸易管理系统的分库分表设计,核心是结合业务逻辑选分片键,解决数据倾斜和跨库事务。首先分片键:订单表按订单ID哈希(如order_id % 库表数)分片,库存表按商品ID区间(如0-1000为库表0)分片,这样均匀分布数据。但订单ID可能热点(如某用户频繁下单),导致倾斜,用复合分片键(order_id + 下单时间取模)或虚拟分片键(order_id%4+时间取模)解决。跨库事务方面,订单创建扣减库存需原子性,用Seata AT模式,全局事务ID关联操作,确保要么全部成功要么回滚。另外,分库分表后要配置读写分离(主从复制+中间件),提升性能。当库表数量增加时,动态调整分片键(如库表数从4到8,分片键改为order_id % 8),迁移数据到新库表,避免业务中断。”