sharding-jdbc 的 RangeShardingAlgorithm 怎么用?
https://segmentfault.com/a/11... 对于这篇文章
有2点我不是很明白,请指点一下。
在我的想象中:PreciseShardingAlgorithm 和 RangeShardingAlgorithm 应该是二选一。文中和官方说 RangeShardingAlgorithm 是可选。(我第一直觉 RangeShardingAlgorithm 应该是按范围分片😂)
文档中说 PreciseShardingAlgorithm 是用于处理 BETWEEN AND 分片。那么在分片主键采用求余算法时,我觉得 PreciseShardingAlgorithm 似乎没有存在的意义,因为此时一个范围内的主键往往是散落在不同表中的。
如果说 RangeShardingAlgorithm 确实是和 PreciseShardingAlgorithm 配合使用的,那么在 inline 表达式中是否要做额外配置(由于使用了 RangeShardingAlgorithm),如果是那怎么配置呢?
以上两点,我究竟误解在什么地方了呢?请帮忙指明一下。
以下个人理解,可能有不对之处,欢迎讨论。
(1)精确分片 和 范围分片
PreciseShardingAlgorithm 要求是必选的,RangeShardingAlgorithm 是可选的。也就是你如果使用 RangeShardingAlgorithm 分片,也要必须实现 PreciseShardingAlgorithm 精确分片。
PreciseShardingAlgorithm 只支持 = in 的操作,RangeShardingAlgorithm 只支持 BETWEEN AND, >, <, >=, <= 操作。
范围分片,应该比较适合对一定范围的数据的处理,能避免对更多的库和表进行sql执行。
精确分片,应该比较适合没有范围的数据处理,也就是你说的主键求余。
(2)行表达式
官方说明:
行表达式,使用Groovy的表达式,提供对SQL语句中的=和IN的分片操作支持,只支持单分片键。对于简单的分片算法,可以通过简单的配置使用,从而避免繁琐的Java代码开发,如:
t_user_$->{u_id % 8}
表示t_user表根据u_id模8,而分成8张表,表名称为t_user_0
到t_user_7
所以复杂的分片算法,可以通过java配置来实现
下面这个就是 范围分片的一个实现, 基于 sharding-jdbc 4 版本
github: 代码地址