Skip to content

P86 ShardingSphere 支持哪些分片算法? ​

面试题:ShardingSphere 支持哪些分片算法?各自怎么用?

1. 分片算法分类 ​

ShardingSphere 的分片算法按来源分:

  1. 内置算法(内置分片算法,配置即用);
  2. 自定义算法(Java 实现 StandardShardingAlgorithm 等)。

2. 内置分片算法 ​

① 取模分片(MOD) ​

yaml
sharding:
  algorithms:
    order-mod:
      type: MOD
      props:
        sharding-count: 4

shardingValue % 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 算法;选型看数据分布特征,核心是分片键要能均匀分散且查询必须带分片键。

基于 VitePress 重建