P86 ShardingSphere 支持哪些分片算法?
面试题:ShardingSphere 支持哪些分片算法?各自怎么用?
1. 分片算法分类
ShardingSphere 的分片算法按来源分:
- 内置算法(内置分片算法,配置即用);
- 自定义算法(Java 实现 StandardShardingAlgorithm 等)。
2. 内置分片算法
① 取模分片(MOD)
yaml
sharding:
algorithms:
order-mod:
type: MOD
props:
sharding-count: 4shardingValue % 4 路由到分片。简单,但扩容要迁移数据。
② 哈希取模(HASH_MOD)
text
hash(分片键) % sharding-count解决"分片键本身有规律(如自增)导致分布不均"的问题。
③ 范围分片(RANGE / STANDARD)
text
按分片键范围路由:user_id < 1000 → 0 号片,1000~2000 → 1 号片...- 适合按时间/ID 区间分片,支持范围查询;
- 缺点:热点集中在最新区间(如按时间分片,写都在最后一片)。
④ 时间分片(INTERVAL,按时间间隔)
yaml
type: INTERVAL
props:
datetime-pattern: yyyy-MM-dd HH:mm:ss
datetime-lower: 2023-01-01 00:00:00
sharding-suffix-pattern: yyyyMM
interval-unit: MONTHS
interval-amount: 1按月份/天建表(如 order_202401、order_202402),适合日志、流水等时间序列数据。
⑤ 其他内置
- BOUNDARY_RANGE:自定义边界列表;
- VOLUME_RANGE:按数据量/容量区间分片;
- CLASS_BASED / 自定义类:通过配置指向自己实现的算法类。
3. 标准接口
自定义分片实现接口:
java
public class MyShardingAlgorithm implements StandardShardingAlgorithm<Long> {
@Override
public String doSharding(Collection<String> availableTargetNames,
PreciseShardingValue<Long> shardingValue) {
// 精确路由:根据分片值返回目标表名
}
}4. 选型建议
| 场景 | 算法 |
|---|---|
| 常规均匀分布 | HASH_MOD / MOD |
| 按时间归档(日志/流水) | INTERVAL 时间分片 |
| 明确区间(区域/ID 段) | RANGE / BOUNDARY_RANGE |
| 特殊规则 | 自定义算法 |
5. 加分点
- 说清分片键选择是算法能否生效的前提(查询必须带分片键);
- 提到"分片算法 + 分片策略(standard/complex/hint/inline)"两个概念的区别;
- 追问"取模扩容":取模分片扩容要全量迁移,可用一致性哈希或双层路由缓解;
- 提到 inline 表达式(如
t_order_$->{user_id % 4})适合简单场景。
一句话总结
ShardingSphere 内置取模(MOD)、哈希取模(HASH_MOD)、范围(RANGE)、时间间隔(INTERVAL)等分片算法,也支持自定义 Java 算法;选型看数据分布特征,核心是分片键要能均匀分散且查询必须带分片键。