1. 标准分片算法

标准分片算法,它只支持对单个分片键(字段)为依据的分库分表。

使用场景:SQL 语句中有>,>=, <=,<,=,IN 和 BETWEEN AND 操作符.

img

我们需要实现 StandardShardingAlgorithm 接口 ,接口包含两个方法:精准分片范围分片

1、精准分片

当我们将分片键设置为 order_id 时,并且自定义标准分片算法 MyTestStandardAlgorithm 。

当查询如下语句时 :

1
SELECT * FROM t_order where order_id = 1 or order_id in (2 , 3);

img

精准分片算法会执行三次,因为通过解析引擎 ,可以解析出 orderId 包含三个值,分别是 1、2、3 。

每次执行 doSharding 方法时,会根据 shardingValue 的值(value 属性),填充算法逻辑,计算出路由的目标(availableTargetNames)。

2、范围分片

使用场景:当我们 SQL中的分片键字段用到 BETWEEN AND操作符会使用到此算法,会根据 SQL中给出的分片键值范围值处理分库、分表逻辑。

1
SELECT * FROM t_order where  order_id BETWEEN 1 AND 100;

img

从图中,我们发现 shardingValue 的类型是 RangeShardingValue ,我们可以通过 valueRange 的 lowerBound(1) 和 upperBound (100) ,填充算法逻辑,判断路由到目标( availableTargetNames )。

2. 复合分片算法

img

使用场景:SQL 语句中有 >,>=, <=,<,=,IN 和 BETWEEN AND 等操作符,不同的是复合分片策略支持对多个分片键操作。

下面我们实现同时以 order_id、user_id 两个字段作为分片键,自定义复合分片策略。

1
SELECT * FROM t_order where  user_id = 0 and order_id = 1

img

我们传递了两个参数,指定了两个分片键 user_id 、order_id , 当配置新的复合分片算法类后,调试时,shardingValue 的类型是 ComplexKeysShardingValue , 可以通过该对象获取解析出来的多个分片键的值,填充算法逻辑,计算出路由的目标( availableTargetNames )。

3. Hint分片算法

Hint 分片算法相比于上面两种分片算法稍有不同,它无需配置分片键,分片键值也不再从 SQL中解析,而是由外部指定分片信息,让 SQL在指定的分库、分表中执行。

ShardingSphere 通过 Hint API实现指定操作,实际上就是把分片规则tablerule 、databaserule由集中配置变成了个性化配置。

img

举个例子,如果我们希望订单表 t_order用 user_id 做分片键进行分库分表,但是 t_order 表中却没有 user_id 这个字段,这时可以通过 Hint API 在外部手动指定分片键或分片库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 清除掉上一次的规则,否则会报错

HintManager.clear();

// HintManager API 工具类实例

HintManager hintManager = HintManager.getInstance();

// 直接指定对应具体的数据库

hintManager.addDatabaseShardingValue("ds",0);

// 手工设置表的分片键

hintManager.addTableShardingValue("t_order" , 0);

hintManager.addTableShardingValue("t_order" , 1);

hintManager.addTableShardingValue("t_order" , 2);

// JDBC 查询

PreparedStatement ps = connection.prepareStatement("select * from t_order ");

ps.executeQuery();

img

定义了一个 Hint分片算法类,在代码中手工设置表的分片键,逻辑表对应了三个值,分别是 0、1、2。

调试 Hint 分片算法类时,shardingValue 的类型是 HintShardingValue ,可以获取我们手工设置的值,只需要填充算法逻辑,计算出路由的目标( availableTargetNames )即可。

4. 总结

本文介绍了 shardingsphere-JDBC 的三种基本分片算法:标准分片算法复合分片算法Hint 分片算法

  1. 标准分片算法:它只支持对单个分片键(字段)为依据的分库分表 ;
  2. 复合分片算法:它支持对多个分片键(字段)为依据的分库分表 ;
  3. Hint 分片算法:它无需配置分片键 ,外部指定分片信息,让 SQL在指定的分库、分表中执行。

不管哪种分片算法,都是解析引擎执行之后,获取到 shardingValue 的分片值,然后填充算法逻辑,最后计算出路由的目标。


本站由 卡卡龙 使用 Stellar 1.29.1主题创建

本站访问量 次. 本文阅读量 次.