SharingSphere 分库分表详解
1,什么是分库分表
分库分表是一种将数据拆分到多个数据库或者数九表中的设计策略,主要用于解决随着业务数据量和访问量增长带来的数据库性能问题
通过分库分表,可以减小单个数据库或者单个数据表的访问压力,从而提高查询和写入效率 ,增强系统的并发能力,优化大数据量下的性能表现
实现分库分表
基于业务需求,设计数据分片规则,将数据按照一定的策略,分散到多个数据库或者数据表中去存储,同时开发路由逻辑来决定查询或者写入的错做的目标库表
简单来说就是将数据写入到不同的表中,并且从相同的数据表中读取数据
SharingSphere 分库分表

<!-- 分库分表 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>5.2.0</version>
</dependency>
分表策略:静态分表
直接再配置文件中编写分库分表的配置就能完成分库分表
比如
rules:
sharding:
tables:
picture:
actualDataNodes: ds0.picture_${0..2} # 3张分表:picture_0, picture_1, picture_2
tableStrategy:
standard:
shardingColumn: pictureId # 按 pictureId 分片
shardingAlgorithmName: pictureIdMod
shardingAlgorithms:
pictureIdMod:
type: INLINE
props:
algorithm-expression: picture_${pictureId % 3} # 分片表达式
在查询表的时候(一般叫逻辑表),框架会自动帮助修改 sssql,根据 id 将查询请求路由到不同的表中
实际上,ShardingSphere 将查询逻辑表的请求自动路由到所有的是积分表,获取到数据之后,在中间层自动合并结果并返回给后端
分表策略:动态分表
就是分表的数量可以根据业务一的实际需求动态的增加,表的结构和队则都是运行的时候动态生成的,
但是动态分表需要自定义实现分表算法类
public class PictureShardingAlgorithm implements StandardShardingAlgorithm<Long> {
@Override
public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> preciseShardingValue) {
// 编写分表逻辑,返回实际要查询的表名
// picture_0 物理表,picture 逻辑表
}
@Override
public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<Long> rangeShardingValue) {
return new ArrayList<>();
}
@Override
public Properties getProps() {
return null;
}
@Override
public void init(Properties properties) {
}
}
那么常用的分库分表算法都有哪些呢:
一、哈希取模算法(最常用)
核心:对分片键(如用户ID)做哈希运算后取模,映射到对应库/表,均匀性好、实现简单。
• 普通取模:库/表索引 = 分片键 % 总数量(扩容需重分布数据,易雪崩)
• 一致性哈希:将分片键和节点映射到哈希环,就近匹配,支持平滑扩容,解决普通取模的扩容痛点。
二、范围分片算法
核心:按分片键的数值/时间范围划分库/表,如按用户ID 0-100万存表1、100-200万存表2,或按日期分表(202501、202502)。
• 优点:易扩容、范围查询高效(如查某时间段数据);
• 缺点:易数据倾斜(热点区间数据集中)。
三、列表分片算法
核心:为分片键配置固定的映射关系表,如指定用户ID 1/3/5存库1,2/4/6存库2,或按地区(北京/上海)映射不同库。
• 优点:规则明确、适配业务定制化需求;
• 缺点:需维护映射表,分片键值过多时维护成本高。
四、复合分片算法
核心:组合哈希+范围/列表等多种算法,如先按用户ID范围分库,再按哈希取模分表,兼顾范围查询效率和数据均匀性,适配复杂业务场景。
五、按时间分片算法(范围分片特例,高频单独使用)
核心:专为时间型分片键设计(如订单创建时间、日志时间),按天/周/月/年分表,适配流水类数据(订单、日志、交易记录)。
• 优点:冷热数据易分离(归档历史表)、写入压力分散;
• 缺点:单时间区间易成热点(如大促当天订单表)。
六、取模分片变种:哈希后按段映射
核心:对分片键哈希后,将哈希值按固定区间段映射到库/表(如哈希值0-10000对应表1,10001-20000对应表2),兼顾均匀性,比普通取模更灵活。
各算法核心适用场景
算法 核心适用场景 典型分片键
哈希取模 无明显热点、需均匀分布数据 用户ID、商品ID
一致性哈希 需频繁扩容、节点动态增减的场景 分布式集群分片
范围分片 高频范围查询、数据有明确区间 订单ID、时间戳
列表分片 业务需定制化映射、分片键值少 地区、商户类型
时间分片 流水类数据、冷热数据需分离 创建时间、日志时间
复合分片 复杂业务(既需范围查又需均匀性) 用户ID+订单时间
补充:分片算法选型核心原则
1. 优先选哈希取模/一致性哈希(无特殊业务要求时),保证数据均匀;
2. 流水类数据必选时间分片,搭配冷热分离策略;
3. 需高频范围查询选范围分片,规避热点需结合哈希二次分片;
4. 定制化业务规则选列表分片,控制映射表规模。
更多推荐
所有评论(0)