Java猿社区—ShardingSphere之广播表与绑定表
Java猿社区—ShardingSphere之广播表与绑定表
文章目录
- Java猿社区—ShardingSphere之广播表与绑定表
- 概念
- 绑定表——联表查询防止出现笛卡尔积现象
- 如何配置绑定表
- 广播表(字典表)
- 如何配置广播表
参考:
ShardingSphere中文文档
概念
逻辑表:水平拆分的数据库(表)的相同逻辑和数据结构表的总称。例:订单数据根据主键尾数拆分为10张表,分别是t_order_0到t_order_9,他们的逻辑表名为t_order。
真实表:在分片的数据库中真实存在的物理表。即上个示例中的t_order_0到t_order_9。
数据节点:数据分片的最小单元。由数据源名称和数据表组成,例:ds_0.t_order_0。
绑定表——联表查询防止出现笛卡尔积现象
绑定表: 指分片规则一致的主表和子表。
例如:t_order表和t_order_item表,均按照order_id分片,则此两张表互为绑定表关系。绑定表之间的多表关联查询不会出现笛卡尔积
关联,关联查询效率将大大提升。如果SQL为:
SELECT i.* FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
在不配置绑定表关系时,假设分片键order_id将数值10路由至第0片,将数值11路由至第1片,那么路由后的SQL应该为4条,它们呈现为笛卡尔积:
SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);SELECT i.* FROM t_order_0 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);SELECT i.* FROM t_order_1 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
在配置绑定表关系后,路由的SQL应该为2条:
SELECT i.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);SELECT i.* FROM t_order_1 o JOIN t_order_item_1 i ON o.order_id=i.order_id WHERE o.order_id in (10, 11);
其中t_order在FROM的最左侧,ShardingSphere将会以它作为整个绑定表的主表。 所有路由计算将会只使用主表的策略,那么t_order_item表的分片计算将会使用t_order的条件。故绑定表之间的分区键要完全相同。
如何配置绑定表
通过sharding.jdbc.config.sharding.binding-tables[0]=t_order,t_order_item
配置
如springboot配置:
# t_order 根据order_id分表
sharding.jdbc.config.sharding.tables.t_order.actual-data-nodes=ds.t_order_$->{0..1}
sharding.jdbc.config.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
sharding.jdbc.config.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{order_id % 2}
sharding.jdbc.config.sharding.tables.t_order.key-generator-column-name=order_id# t_order_item 根据order_id字段分表
sharding.jdbc.config.sharding.tables.t_order_item.actual-data-nodes=ds.t_order_item_$->{0..1}
sharding.jdbc.config.sharding.tables.t_order_item.table-strategy.inline.sharding-column=order_id
sharding.jdbc.config.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item_$->{order_id % 2}
sharding.jdbc.config.sharding.tables.t_order_item.key-generator-column-name=order_item_id#绑定表规则列表
sharding.jdbc.config.sharding.binding-tables[0]=t_order,t_order_item
广播表(字典表)
有一些表是没有分片的必要的,比如省份信息表,全国也就30多条数据,这种表在每一个节点上都是一样的,这种表叫做广播表
如何配置广播表
情景一: 两个数据源ds0,ds1,配置表t_config作为广播表配置到ds0库中,这样以后的关联t_config表的联表查询语句会被路由到ds0库中的t_config表中查询数据。
# 这里要注册所有的数据源
spring.shardingsphere.datasource.names=ds0,ds1# 这是数据源0的配置
spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=# 这是数据源1的配置
spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://localhost:3307/test?serverTimezone=GMT%2B8
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=# 分库策略
# 分库的列是user_id
spring.shardingsphere.sharding.default-database-strategy.standard.sharding-column=user_id
spring.shardingsphere.sharding.default-database-strategy.standard.precise-algorithm-class-name=com.sinosun.demo.sharding.PreciseShardingAlgorithmImpl# 分表策略
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds$->{0..1}.t_order$->{0..1}
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=order_id
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order$->{order_id % 2}
spring.shardingsphere.sharding.tables.t_order.key-generator.column=order_id
spring.shardingsphere.sharding.tables.t_order.key-generator.type=SNOWFLAKEspring.shardingsphere.sharding.tables.t_order_item.actual-data-nodes=ds$->{0..1}.t_order_item$->{0..1}
spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.sharding-column=order_id
spring.shardingsphere.sharding.tables.t_order_item.table-strategy.inline.algorithm-expression=t_order_item$->{order_id % 2}spring.shardingsphere.sharding.binding-tables=t_order, t_order_item# 广播表, 其主节点是ds0
spring.shardingsphere.sharding.broadcast-tables=t_config
spring.shardingsphere.sharding.tables.t_config.actual-data-nodes=ds$->{0}.t_configspring.jpa.show-sql=true
欢迎加入Java猿社区! 免费领取我历年收集的所有学习资料哦!
Java猿社区—ShardingSphere之广播表与绑定表相关推荐
- Java猿社区—Redis一篇系列—第二章、Redis入门和安装
欢迎关注作者博客 简书传送门 专栏传送门:Redis深入学习之路 文章目录 2.Redis入门和安装 2.1.Redis是什么? 2.1.1.特性 2.2.能干嘛? 2.3.官方传送站 2.4.怎么玩 ...
- Java猿社区—Redis一篇系列—第三章、Redis数据类型
欢迎关注作者博客 简书传送门 专栏传送门:Redis深入学习之路 文章目录 1.Redis的五大数据类型 1.1.string(字符串) 1.2.hash(哈希) 1.3.list(列表) 1.4.s ...
- Java猿社区—Redis一篇系列—第一章、NoSql入门和概述
欢迎关注作者博客 简书传送门 专栏传送门:Redis深入学习之路 文章目录 前言 1.NoSql入门和概述 1.1.入门概述 1.1.1.为什么用NoSql? 单机MySQL的美好年代 Memcach ...
- Java猿社区—log4j2一站式教程
Java猿社区-log4j2一站式教程 文章目录 Java猿社区-log4j2一站式教程 前言 Log4j2.Log4j.Logback性能压测对比 1000w条消息测试 985M 官方性能测试报告 ...
- Java猿社区—Apache Commons Collections—CollectionUtils工具类详解
欢迎关注作者博客 简书传送门 文章目录 前言 代码示例 前言 论阅读源码的重要性,后期会对各大开源框架相关源码做详细阅读,并熟悉使用,本次主要对Apache Commons Collections中C ...
- Java猿社区—Http digest authentication 请求代码最全示例
文章目录 什么是摘要认证 服务器核实用户身份 客户端反馈用户身份 server 确认用户 代码示例 欢迎关注作者博客 简书传送门 什么是摘要认证 摘要认证( Digest authentication ...
- Sharding-JDBC主子表(绑定表)关联
目录 前言 前文 什么是绑定表? 创建子表 boot 配置编写 功能测试 父子表关联查询测试 前言 主子表关联在我们的开发业务中是及其常见的,本文我们就来看下如何在分库分表的情况下,使用Shardin ...
- 视频教程-ShardingSphere:SpringBoot2+MybatisPlus读写分离+分表-Java
ShardingSphere:SpringBoot2+MybatisPlus读写分离+分表 10多年互联网一线实战经验,现就职于大型知名互联网企业,架构师, 有丰富实战经验和企业面试经验:曾就职于某上 ...
- 2、ShardingSphere 之 Sharding-JDBC实现水平分表
文章目录 1 Sharding-JDBC简介 2 Sharding-JDBC 3 Sharding-JDBC实现水平分表 3.1 搭建环境 3.1.1 总体概览 3.1.2 创建SpringBoot工 ...
最新文章
- MIT造了个“小盒子”,可以无线监测新冠患者症状,斯隆奖获得者班底打造
- Python小白学习之函数装饰器
- 屌丝。。。配角。。。
- Wechat的支付逻辑流程
- Elasticsearch SQL介绍及实例
- 判断鼠标是否在元素上_能不能从大便上判断出一个人是否患有结肠癌?
- scss-字符串连接符
- project日历设置-大小周交替
- 华为ipd项目管理流程_IPD:一套卓越的产品开发经营体系
- linux隐藏tomcat版本_Ubuntu 14.04隐藏Tomcat-7.0.52的版本号与操作系统类型
- android 初始化类,Android 常用编程技巧/Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)...
- CTS(23) --- Android 8.1GMS注意事项
- android 无线接口 泛收,Android下的Java之interface接口泛型 动态获取泛型的类型
- python基础编程练习题_Python随笔18:Python基础编程练习题1~2
- 【vue】使用Promise方法保证按顺序执行
- Windows内核研究总结
- 前端面试笔试编程题(持续更新中)
- python中beautifulsoup是什么,Python Beautiful Soup简介
- EasyCVR国标GB28181协议接入下的TCP和UDP模式说明及差异
- win10文件夹变成exe病毒的解决方法
热门文章
- 成功 自信 快乐, ――给中国青年学生的一封信
- [【转载】什么是图数据库以及简单入门!
- 气源站护士站区域气体监控解决方案
- 畅享10S 鸿蒙,华为畅享10S正式发布 4800万超广角AI三摄1799元起
- PWM的调光基本原理
- 流氓软件插件中介商自述黑色淘金路(转)
- 古人对梦的解释_中国古代对梦的解释-精选文档
- c语言编写音乐播放器完整代码(mciSendString函数的使用方法,第一次使用Visual Studio 2019的详细步骤)
- 聊一聊DNS劫持那些事
- 理解操作系统的sleep函数