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之广播表与绑定表相关推荐

  1. Java猿社区—Redis一篇系列—第二章、Redis入门和安装

    欢迎关注作者博客 简书传送门 专栏传送门:Redis深入学习之路 文章目录 2.Redis入门和安装 2.1.Redis是什么? 2.1.1.特性 2.2.能干嘛? 2.3.官方传送站 2.4.怎么玩 ...

  2. Java猿社区—Redis一篇系列—第三章、Redis数据类型

    欢迎关注作者博客 简书传送门 专栏传送门:Redis深入学习之路 文章目录 1.Redis的五大数据类型 1.1.string(字符串) 1.2.hash(哈希) 1.3.list(列表) 1.4.s ...

  3. Java猿社区—Redis一篇系列—第一章、NoSql入门和概述

    欢迎关注作者博客 简书传送门 专栏传送门:Redis深入学习之路 文章目录 前言 1.NoSql入门和概述 1.1.入门概述 1.1.1.为什么用NoSql? 单机MySQL的美好年代 Memcach ...

  4. Java猿社区—log4j2一站式教程

    Java猿社区-log4j2一站式教程 文章目录 Java猿社区-log4j2一站式教程 前言 Log4j2.Log4j.Logback性能压测对比 1000w条消息测试 985M 官方性能测试报告 ...

  5. Java猿社区—Apache Commons Collections—CollectionUtils工具类详解

    欢迎关注作者博客 简书传送门 文章目录 前言 代码示例 前言 论阅读源码的重要性,后期会对各大开源框架相关源码做详细阅读,并熟悉使用,本次主要对Apache Commons Collections中C ...

  6. Java猿社区—Http digest authentication 请求代码最全示例

    文章目录 什么是摘要认证 服务器核实用户身份 客户端反馈用户身份 server 确认用户 代码示例 欢迎关注作者博客 简书传送门 什么是摘要认证 摘要认证( Digest authentication ...

  7. Sharding-JDBC主子表(绑定表)关联

    目录 前言 前文 什么是绑定表? 创建子表 boot 配置编写 功能测试 父子表关联查询测试 前言 主子表关联在我们的开发业务中是及其常见的,本文我们就来看下如何在分库分表的情况下,使用Shardin ...

  8. 视频教程-ShardingSphere:SpringBoot2+MybatisPlus读写分离+分表-Java

    ShardingSphere:SpringBoot2+MybatisPlus读写分离+分表 10多年互联网一线实战经验,现就职于大型知名互联网企业,架构师, 有丰富实战经验和企业面试经验:曾就职于某上 ...

  9. 2、ShardingSphere 之 Sharding-JDBC实现水平分表

    文章目录 1 Sharding-JDBC简介 2 Sharding-JDBC 3 Sharding-JDBC实现水平分表 3.1 搭建环境 3.1.1 总体概览 3.1.2 创建SpringBoot工 ...

最新文章

  1. MIT造了个“小盒子”,可以无线监测新冠患者症状,斯隆奖获得者班底打造
  2. Python小白学习之函数装饰器
  3. 屌丝。。。配角。。。
  4. Wechat的支付逻辑流程
  5. Elasticsearch SQL介绍及实例
  6. 判断鼠标是否在元素上_能不能从大便上判断出一个人是否患有结肠癌?
  7. scss-字符串连接符
  8. project日历设置-大小周交替
  9. 华为ipd项目管理流程_IPD:一套卓越的产品开发经营体系
  10. linux隐藏tomcat版本_Ubuntu 14.04隐藏Tomcat-7.0.52的版本号与操作系统类型
  11. android 初始化类,Android 常用编程技巧/Java类的初始化顺序 (静态变量、静态初始化块、变量、初始化块、构造器)...
  12. CTS(23) --- Android 8.1GMS注意事项
  13. android 无线接口 泛收,Android下的Java之interface接口泛型 动态获取泛型的类型
  14. python基础编程练习题_Python随笔18:Python基础编程练习题1~2
  15. 【vue】使用Promise方法保证按顺序执行
  16. Windows内核研究总结
  17. 前端面试笔试编程题(持续更新中)
  18. python中beautifulsoup是什么,Python Beautiful Soup简介
  19. EasyCVR国标GB28181协议接入下的TCP和UDP模式说明及差异
  20. win10文件夹变成exe病毒的解决方法

热门文章

  1. 成功 自信 快乐, ――给中国青年学生的一封信
  2. [【转载】什么是图数据库以及简单入门!
  3. 气源站护士站区域气体监控解决方案
  4. 畅享10S 鸿蒙,华为畅享10S正式发布 4800万超广角AI三摄1799元起
  5. PWM的调光基本原理
  6. 流氓软件插件中介商自述黑色淘金路(转)
  7. 古人对梦的解释_中国古代对梦的解释-精选文档
  8. c语言编写音乐播放器完整代码(mciSendString函数的使用方法,第一次使用Visual Studio 2019的详细步骤)
  9. 聊一聊DNS劫持那些事
  10. 理解操作系统的sleep函数