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

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

公众号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年算法题讲解视频》,最终以初试专业第三名进入了北理工软件工程专业。熟悉并掌握常见的数据结构,比如链表、数组、树、图、队列、堆栈等等,精通数据结构教材中的所有算法,比如常见的遍历算法、动态规划,递归,回溯,剪枝,并查集,最短路径,拓扑排序等,所以快加入训练营吧,我们一起进步

奔跑的小梁,公众号:梁霖编程工具库我决定了,算法文档开源!!
相关文章
|
2月前
|
存储 NoSQL Redis
分片集群:横向扩展
【10月更文挑战第4天】
52 0
|
5月前
|
存储 负载均衡 定位技术
现代数据库系统中的数据分片策略与优化
数据分片在现代数据库系统中扮演着关键角色,特别是在面对海量数据和高并发访问的情况下。本文探讨了数据分片的基本概念、常见的分片策略(如水平分片与垂直分片)、以及如何通过优化和选择合适的分片策略来提升数据库系统的性能和可扩展性。
38MyCat - 分片规则(自然月分片)
38MyCat - 分片规则(自然月分片)
60 0
|
SQL 算法 Java
自定义水平分库分表策略【范围分片】
自定义水平分库分表策略【范围分片】
|
数据库
分库分表后路由策略设计
分库分表后设计到的第一个问题就是,如何选择路由key,应该如何对key进行路由。路由key应该在每个表中都存在而且唯一。路由策略应尽量保证数据能均匀进行分布。 如果是对大数据量进行归档类的业务可以选择时间作为路由key。比如按数据的创建时间作为路由key,每个月或者每个季度创建一个表。按时间作为分库分表后的路由策略可以做到数据归档,历史数据访问流量较小,流量都会打到最新的数据库表中。 也可以设计其与业务相关的路由key。这样可以保证每个数据库的资源都能很好的承担流量。
|
算法 Java 数据库连接
自定义水平分库分表的策略【精准分片】
自定义水平分库分表的策略【精准分片】
|
SQL 算法 Java
自定义水平分库分表策略【hint分片】
自定义水平分库分表策略【hint分片】
|
算法 Java 程序员
水平分库分表的策略
水平分库分表的策略
|
存储 程序员 数据库
如何选择合适的分表分库方案
如何选择合适的分表分库方案
95 0
|
存储 算法 关系型数据库
MyCat - 分片 - 水平拆分 - 分片配置及测试 | 学习笔记
快速学习 MyCat - 分片 - 水平拆分 - 分片配置及测试
MyCat - 分片 - 水平拆分 - 分片配置及测试 | 学习笔记