自定义水平分库分表策略【范围分片】

简介: 自定义水平分库分表策略【范围分片】

公众号merlinsea


背景


   假设某个数据库中有product_order_0表和product_order_1表,这两张表根据id进行分表,id%2==0的数据放在product_order_0表 中,id%2==1的数据放在product_order_1表中,在昨天的公众号中我们解决了精确匹配问题,那么如果我们查询的sql是范围匹配 between-and的条件,那么怎么处理呢?

   比如 select * from product_order where id between 1 and 2; 【这里的id是分片键,同时这个分片键是用between-and进行限制】,这个时候就需要用到范围分片。

   没配置的话会报错 Cannot find range sharding strategy in sharding rule.


1、编写范围分表类,实现RangeShardingAlgorithm<T>,范型T是分片键的数据类型


public class CustomRangeShardingAlgorithm implements RangeShardingAlgorithm<Long> {
    /**
     *
     * @param dataSourceNames 数据源集合
     *                      在分库时值为所有分片库的集合 databaseNames
     *                      分表时为对应分片库中所有分片表的集合 tablesNames
     *
     * @param shardingValue  分片属性,包括
     *                                  logicTableName 为逻辑表,
     *                                  columnName 分片健(字段),
     *                                  valueRange 为从 SQL 中解析出的between-and值
     * @return
     */
    @Override
    public Collection<String> doSharding(Collection<String> dataSourceNames, RangeShardingValue<Long> shardingValue) {
        Set<String> result = new LinkedHashSet<>();
        //between 开始值
        Long lower  = shardingValue.getValueRange().lowerEndpoint();
        //between 结束值
        Long upper = shardingValue.getValueRange().upperEndpoint();
        //这里的i都是用于分表的key
        for(long i=lower;i<=upper;i++){
            //按照分表规则匹配每一张表,把符和规则的表加入到result中
            for(String datasource : dataSourceNames){
                String value = i % dataSourceNames.size() +"";
                if(datasource.endsWith(value)){
                    result.add(datasource);
                }
            }
        }
        return result;
    }
}

2、在application.properties配置文件中添加如下内容

注意:我们下面的这个配置是针对product_order表的


#范围分片(水平分表)
spring.shardingsphere.sharding.tables.product_order.table-strategy.standard.range-algorithm-class-name=net.xdclass.strategy.CustomRangeShardingAlgorithm


640.jpg


关于leetcode算法训练营:

   加我微信号私聊参加训练营,尤其是想进入大厂工作的同学,算法是绕不过去的坎,我自己花了三年时间刷算法,总结思路,刷各种数据结构课程,加入我的训练营,我手把手以在线直播课的形式带你理思路,手把手带你写代码,让你真正体会算法之美~,同时遇到不明白的地方可以直接课上和我沟通,彻底解决你的代码困难症~

本人用c++刷了800道左右的算法,java语言刷了600道左右的算法题,并对这些题做了详细的个人总结。本科期间系统学习了数据结构与算法课程,同时考研过程中写完了率辉主编的《2020年数据结构高分笔记》和《数据结构1000题》,看完的视频包括《mooc浙大数据结构国家精品课程》和《王道考研408数据结构课程》,《王道2019年算法题讲解视频》,最终以初试专业第三名进入了北理工软件工程专业。熟悉并掌握常见的数据结构,比如链表、数组、树、图、队列、堆栈等等,精通数据结构教材中的所有算法,比如常见的遍历算法、动态规划,递归,回溯,剪枝,并查集,最短路径,拓扑排序等,所以快加入训练营吧,我们一起进步

奔跑的小梁,公众号:梁霖编程工具库我决定了,算法文档开源!!
相关文章
|
7月前
38MyCat - 分片规则(自然月分片)
38MyCat - 分片规则(自然月分片)
25 0
|
9月前
|
数据库
分库分表后路由策略设计
分库分表后设计到的第一个问题就是,如何选择路由key,应该如何对key进行路由。路由key应该在每个表中都存在而且唯一。路由策略应尽量保证数据能均匀进行分布。 如果是对大数据量进行归档类的业务可以选择时间作为路由key。比如按数据的创建时间作为路由key,每个月或者每个季度创建一个表。按时间作为分库分表后的路由策略可以做到数据归档,历史数据访问流量较小,流量都会打到最新的数据库表中。 也可以设计其与业务相关的路由key。这样可以保证每个数据库的资源都能很好的承担流量。
|
10月前
|
SQL 算法 Java
自定义水平分库分表策略【范围分片】
自定义水平分库分表策略【范围分片】
|
10月前
|
算法 Java 数据库连接
自定义水平分库分表的策略【精准分片】
自定义水平分库分表的策略【精准分片】
|
10月前
|
SQL 算法 Java
自定义水平分库分表策略【hint分片】
自定义水平分库分表策略【hint分片】
|
10月前
|
算法 Java 程序员
水平分库分表的策略
水平分库分表的策略
|
存储 缓存 算法
短链系统设计性能优化-分片键选型及全局自增 ID 策略
若一个 long 可对应多个 short 使用 cache 缓存所有 long2short 在为一个 long url 创建 short url 时,若 cache miss,则创建新 short
58 0
|
存储 负载均衡 算法
分布式主键生成设计策略
分布式主键生成设计策略
274 0
分布式主键生成设计策略
|
存储 算法 关系型数据库
MyCat - 分片 - 水平拆分 - 分片配置及测试 | 学习笔记
快速学习 MyCat - 分片 - 水平拆分 - 分片配置及测试
110 0
MyCat - 分片 - 水平拆分 - 分片配置及测试 | 学习笔记
|
SQL 中间件 关系型数据库
MyCat - 分片 - 垂直拆分 - 全局表配置 | 学习笔记
快速学习 MyCat - 分片 - 垂直拆分 - 全局表配置
118 0
MyCat - 分片 - 垂直拆分 - 全局表配置 | 学习笔记

热门文章

最新文章