在freyja2里面,对于数据库sharding这方面一张表需要设定一个切分的key列

假设UserProperty 里面有 id,uid,pid,num这4个字段,uid为用户id。我们把这张表以uid来切分

数据库设定为2个, 表切分为5个/库。

db_0,
t_user_0,t_user_1,t_user_2,t_user_3,t_user_4t_user_property_0,t_user_property_1,t_user_property_2,t_user_property_3,t_user_property_4db_1,
t_user_0,t_user_1,t_user_2,t_user_3,t_user_4t_user_property_0,t_user_property_1,t_user_property_2,t_user_property_3,t_user_property_4

freyja2屏蔽了上层分库、分表逻辑

在开发过程中,insert、update、select、delete操作和非sharding 项目没有任何差别

insert一条user记录,

insert user(name)values(?)

如果user是以name列为切分的key列,那么name为?的这条记录会被分配到

 public DbResult getShardingTableName(Object value) {String tableName = getTableName();int hashCode = value.hashCode();if (hashCode < 0) {hashCode = -hashCode;}int dbNo = hashCode % ShardingUtil.engine.getDbNum();int tableNo = hashCode % ShardingUtil.engine.getTableNum();tableName = tableName + "_" + tableNo;return new DbResult(tableName, tableNo, dbNo);}

dbNo数据库的tableNo表

这个时候user的主键:id为自动增长,自然获得了一个对应的id值。那么在查询的时候,

无论是select * from User where id = ? 还是 select * from User where name = ?

都能够找到其所在的dbNo 和tableNo

idSubNum 为每个表的容量

 public DbResult getShardingTableNameById(Object idValue) {String tableName = getTableName();if (idValue == null || !isSubTable()) {return new DbResult(tableName, -1, -1);} else {int n = (Integer) idValue / ShardingUtil.engine.getIdSubNum();int dbNo = n / ShardingUtil.engine.getTableNum();int tableNo = n % ShardingUtil.engine.getTableNum();tableName = tableName + "_" + tableNo;return new DbResult(tableName, tableNo, dbNo);}}

单表的sharding就不多说了,联表查询?

假设有原有这样的一条查询sql:

select * from t_user_property p left join t_user u on p.uid = u.id where u.name = ?

对于sharding之后的应用来说 sql当然不能这样写。

前面说了2点:

1、freyja2是屏蔽上层sharding逻辑的。

2、user的name和id对应的是同一张表、库

在freyja2的处理里面,sql还是按照这样写,根据逻辑freyja根据name的值解析出了user所在的dbNo和tableNo

重新生成sharding的sql(假设tableNo为3,dbNo的作用在于找到对于的数据源):

select * from t_user_property_3 p left join t_user_3 u on p.uid = u.id where u.name = ?
t_user_property 这个表因为也是以uid来分库的,所以其对应的表和库实际上与t_user是一致的。

有2种复杂一点的情况:

1、单表查询不包括key列

2、联合查询以非key列为join列

对于第一种情况,freyja会扫描所有的库、表汇总一个结果集返回来 例如:

select * from t_user where gold > 0
会变为
db_0:
select * from t_user_0 where gold > 0;
select * from t_user_1 where gold > 0;
select * from t_user_2 where gold > 0;
select * from t_user_4 where gold > 0;
db_1:
select * from t_user_0 where gold > 0;
select * from t_user_1 where gold > 0;
select * from t_user_2 where gold > 0;
select * from t_user_4 where gold > 0;

对于第二种情况:

第二种情况比较少见,不可能跨数据源查询。一般既然分库,key列就成为了关键列。所有sql都要围绕着这个列,处理起来需要进行一些变通,暂时没有深挖这部分sql的处理

至于排序、分页存在一种情况:就是非key列的查询,sql中如果带有key列那么排序、分页实际上就是普通的查询一样,数据库来做。但是一旦需要扫描整个库,排序和分页是需要freyja2在返回结果集的时候处理的

在项目里面分出了2个库一共有3个库:db,db_0,db_1 db0和1是存储需要分库的表 db则放置不需要分库的表,毕竟不是每个表都要去分库的。

至于数据迁移和扩容,这部分还未想出比较好的方法。

sharding这部分我一直都认为这是数据库分内的事,应该可以把freyja的sharding这部分再提取出来放在驱动一层上,更加的脱离业务

Freyja2版本对分库分表的处理方式相关推荐

  1. 一种可以避免数据迁移的分库分表scale-out扩容方式

    原文地址:http://jm-blog.aliapp.com/?p=590 目前绝大多数应用采取的两种分库分表规则 mod方式 dayofweek系列日期方式(所有星期1的数据在一个库/表,或所有?月 ...

  2. 【ShardingSphere技术专题】「ShardingJDBC实战阶段」SpringBoot之整合ShardingJDBC实现分库分表(JavaConfig方式)

    前提介绍 ShardingSphere介绍 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC.Sharding-Proxy和Shardin ...

  3. 一文快速入门分库分表中间件 Sharding-JDBC (必修课)

    书接上文 <一文快速入门分库分表(必修课)>,这篇拖了好长的时间,本来计划在一周前就该写完的,结果家庭内部突然人事调整,领导层进行权利交接,随之宣布我正式当爹,紧接着家庭地位滑落至第三名, ...

  4. 分库分表实战(第1期):一叶知秋 —— 图览分库分表外卖订单项目

    +VX:ruyuanhadeng获得600+页原创精品文章汇总PDF 前 言 各位读者朋友,大家好,这是分库分表实战的第一篇文章,首先介绍一下 "基于ShardingSphere的分库分表实 ...

  5. 【Sharding-JDBC系列二】一文快速入门分库分表中间件 Sharding-JDBC (必修课)

    作为Sharding-JDBC 分库分表实战系列的开篇文章,我们在前文中回顾了一下分库分表的基础知识,对分库分表的拆分方式有了一定的了解,下边我们介绍一下 Sharding-JDBC框架和快速的搭建一 ...

  6. ShardingSphere(八) 分库分表的多种分片策略

    在之前文章<ShardingSphere(二) 水平分表配置搭建,实现分表写入读取>中,我们介绍了数据库的水平分表配置,在文章中只介绍了最简单的行表达式分表配置方式,但往往在实际中我们的业 ...

  7. 分库分表和 NewSQL 到底怎么选?

    文章来源:[公众号:CoderW] 目录 背景 分表 分库 分库分表的成本 NewSQL NewSQL 平滑接入方案 NewSQL 真的有那么好吗? NewSQL 的应用 分库分表和 NewSQL 到 ...

  8. MySQL使用MyCat实现分库分表

    MySQL分库分表的实现方式有: shardingJDBC:基于AOP原理,在应用程序中对本地执行的SQL进行拦截,解析.改写.路由处理.需要自行编码配置实现,只支持java语言,性能较高. MyCa ...

  9. 什么是分库分表?为什么需要分表?什么时候分库分表

    不急于上手实战 ShardingSphere 框架,先来复习下分库分表的基础概念,技术名词大多晦涩难懂,不要死记硬背理解最重要,当你捅破那层窗户纸,发现其实它也就那么回事. 什么是分库分表 分库分表是 ...

  10. 脑壳疼,好好的系统,为什么要分库分表?

    大家好,我是小富- 说在前边 今天是<分库分表 ShardingSphere 原理与实战>系列的开篇文章,之前写过几篇关于分库分表的文章反响都还不错,到现在公众号:程序员小富后台不断的有人 ...

最新文章

  1. 编写程序计算交错序列_外文翻译 | FlyMC:高度可扩展地测试分布式系统中的复杂交错...
  2. MySQL子查询操作实例详解
  3. 第九节:JWT简介和以JS+WebApi为例基于JWT的安全校验
  4. Red5开发第一步-Hello World
  5. ios- 自定义cell总结
  6. 13.2 处理静态资源【从零开始学Spring Boot】
  7. 【总结】Unity游戏优化
  8. hbuilderX里uniapp和php,使用 DCloud 工具 HBuilder X 开发 uni-app 项目踩过的一些坑
  9. abb机器人编程指令写字_ABB机器人编程指令创建
  10. Android中OKHttp的基本用法(Get、Post、上传文件等)
  11. centos8同步时间安装时间校准服务
  12. el-scrollbar 优化滚动条样式
  13. opencv2.4.10配置vs2010旗舰版过程与遇到问题的解决
  14. idea Translation插件问题 TKK: 更新 TKK 失败,请检查网络连接解决办法
  15. 动力电池用复合相变材料:国内外导热和储能性能测试中存在的问题
  16. C++ 背包问题——多重背包
  17. 网页上如何禁止复制(如何复制xx网站上的内容)
  18. 4W家庭理财常见问题及解决方法
  19. xxx牌JUC学习加油奥利给001初始篇章
  20. 探寻江南虞山之美 尽享与观致7的一场约会

热门文章

  1. android 音频系统/声卡驱动 codec
  2. xpath获取同级元素 子元素,子元素取父元素等
  3. apfs扩容_小米2020pro增强版 黑苹果 最新教程
  4. 理解两个函数乘积的导数的一种视角
  5. 大行bya412和java513_真实解密大行bya412和k3区别在哪里?哪款最好?老司机透漏评测...
  6. 中国新能源汽车行业十四五展望规划与投资决策建议报告2022版
  7. 使用R包barplot3d绘制3D条形图-2020-07-04Sat
  8. 计算机算法与程序框图,1.1算法与程序框图(3)(教学设计)
  9. 计算机视觉文献综述选题,机器视觉文献综述.doc
  10. 用pc抓取vlan tag数据包