一、基础概念

在分库分表场景下,关联表(JOIN)查询的复杂性主要源于数据分布在不同的数据库或表中。ShardingSphere 通过 绑定表(Binding Table) 和 广播表(Broadcast Table) 机制,结合 内存计算,

有效解决关联查询的难题。以下是具体实现方法和优化策略

二、绑定表(Binding Table)

适用场景:多个表的分片规则一致(如按 user_id 分片),且关联查询的字段是分片键

1、核心原理

  • 分片规则一致:确保关联表的分片键和分片算法完全相同

  • 路由一致性:关联查询时,ShardingSphere 将查询路由到同一分片,避免跨库 JOIN

2、配置示例

# ShardingSphere 配置文件
sharding:
tables:
user:
actual-data-nodes: ds$->{0..3}.user_$->{0..7}
database-strategy:
standard:
sharding-column: user_id
precise-algorithm-class-name: com.example.UserShardingAlgorithm
order:
actual-data-nodes: ds$->{0..3}.order_$->{0..7}
database-strategy:
standard:
sharding-column: user_id
precise-algorithm-class-name: com.example.UserShardingAlgorithm
# 定义绑定表
binding-tables:
- user, order # user 表和 order 表绑定

3、查询示例

-- 查询用户及其订单(user_id 是分片键)
SELECT u.name, o.amount
FROM user u
JOIN order o ON u.user_id = o.user_id
WHERE u.user_id = 123;

执行过程:

  • 根据 user_id = 123 计算分片位置(如 ds1.order_3)。

  • 在同一个分片内执行 JOIN 查询,无需跨库。

4、优势

  • 性能高效:避免跨库数据传输,减少网络和内存开销。

  • 结果准确:数据在同一分片内关联,无需内存二次计算。

三、广播表(Broadcast Table)

适用场景:小表(如字典表、配置表)需要与分片表关联查询,且数据量较小

1、核心原理

  • 全量复制:广播表的数据会被复制到所有分片库中

  • 本地关联:关联查询时,直接在分片库内完成 JOIN

2、配置示例

# ShardingSphere 配置文件
sharding:
tables:
order:
actual-data-nodes: ds$->{0..3}.order_$->{0..7}
database-strategy:
standard:
sharding-column: user_id
precise-algorithm-class-name: com.example.UserShardingAlgorithm
# 定义广播表
broadcast-tables:
- dict # dict 表为广播表

3、查询示例

-- 查询订单及其状态名称(dict 表为广播表)
SELECT o.order_id, d.dict_name
FROM order o
JOIN dict d ON o.status = d.dict_id
WHERE o.user_id = 123;

执行过程:

  • 根据 user_id = 123 路由到对应分片(如 ds1.order_3)。

  • 在分片库内关联本地的 dict 表,直接返回结果。

4、优势

  • 避免跨库查询:广播表在每个分片中都存在,关联查询无需跨库

  • 数据一致性:广播表数据更新时,自动同步到所有分片

四、内存计算(Memory Merge)

适用场景:无法通过绑定表或广播表解决的跨分片 JOIN 查询

1、核心原理

  • 数据拉取:从所有相关分片中拉取数据到内存。

  • 内存计算:在应用层内存中执行 JOIN、排序、聚合等操作。

2、示例

-- 跨分片 JOIN(product 表按 product_id 分片,order 表按 user_id 分片)
SELECT p.product_name, SUM(o.amount)
FROM order o
JOIN product p ON o.product_id = p.product_id
GROUP BY p.product_name;

执行过程:

  • a、从所有分片中拉取 order 和 product 表的数据

  • b、在内存中执行 JOIN 和聚合计算

3、缺点

  • 性能瓶颈:数据量大时,内存和网络开销极高。

  • 结果延迟:不适合实时性要求高的场景。

4、优化建议

  • 预计算:将关联结果存储到宽表中,定期更新。

  • 使用分布式数据库:如 TiDB,原生支持分布式 JOIN。

  • 结合搜索引擎:将数据同步到 Elasticsearch,利用其分布式计算能力。

五、分片策略设计的最佳实践

1、优先绑定表:业务强相关的表(如用户和订单)使用相同的分片键和分片算法

2、广播小表:字典表、配置表等小表设置为广播表

3、避免跨分片 JOIN:所有查询尽量包含分片键

4、冗余字段:在分片表中冗余关联字段(如订单表冗余 product_name),避免 JOIN 查询

六、总结

ShardingSphere 通过 绑定表 和 广播表 机制,在分库分表场景下高效解决关联查询问题:

  • 绑定表:确保关联表的分片规则一致,实现本地 JOIN。

  • 广播表:复制小表到所有分片,避免跨库查询。

  • 内存计算:兜底方案,处理复杂跨分片 JOIN,但需谨慎使用。

实际应用建议:

  • 在数据库设计阶段,优先通过分片键和表结构优化避免跨分片 JOIN。

  • 对于复杂查询,结合 Elasticsearch 或 TiDB 等分布式数据库提升性能。

ShardingSphere 解决关联表查询问题的详细方案的更多相关文章

  1. 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案

    1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...

  2. Mybatis源码分析--关联表查询及延迟加载原理(二)

    在上一篇博客Mybatis源码分析--关联表查询及延迟加载(一)中我们简单介绍了Mybatis的延迟加载的编程,接下来我们通过分析源码来分析一下Mybatis延迟加载的实现原理. 其实简单来说Myba ...

  3. .NetCore中EFCore的使用整理(二)-关联表查询

    EF常用处理关联加载的方式有3中:延迟加载(Lazy Loading).贪婪加载 (Eager Loading)以及显示加载. 一.EF Core  1.1 1.当前的版本,还不支持延迟加载(Lazy ...

  4. SpringBoot Data JPA 关联表查询的方法

    SpringBoot Data JPA实现 一对多.多对一关联表查询 开发环境 IDEA 2017.1 Java1.8 SpringBoot 2.0 MySQL 5.X 功能需求 通过关联关系查询商店 ...

  5. MyBatis实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  6. MyBatis学习总结(五)——实现关联表查询(转载)

    本文转载自:http://www.cnblogs.com/jpf-java/p/6013516.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数 ...

  7. MyBatis入门学习教程-实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  8. MyBatis学习总结(五)——实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  9. MyBatis学习总结(五)——实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  10. 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)

    在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实现.不过这里不说,做关联查询的步骤可以简单的总结为以下的几步: 1.分 ...

随机推荐

  1. 分布式配置中心--Apollo

    分布式配置中心--Apollo Apollo(阿波罗)是携程开源的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,支持配置热发布并实时推送到应用端,并且具备规范的权限及流程治理等特性,适用 ...

  2. uni-app中使用uView组件库

    01通过npm的方式安装uView组件库 uView依赖SCSS,您必须要安装此插件,否则无法正常运行. 如果您的项目是由HBuilder X创建的, 相信已经安装scss插件, 如果没有,请在HX菜 ...

  3. 效率起飞!天翼云并行文件服务HPFS高效应对AI时代大模型训练存储挑战!

    国内外AI大模型层出不穷,训练数据复杂程度更是呈指数级增加.如今,在万亿级参数时代,单个资源池已无法满足大模型训练场景中动辄PB级的数据存储量,对于企业来说,启用多个资源池构成的分布式存储势在必行. ...

  4. 异常:java.lang.reflect.InvocationTargetException

    在产生这个问题的时候,以为是代码某个类又改动了.但是对比了git,发现并没有改动,测试环境代码照跑,故又重新拉了一份重新部署,仍然报同样的错.解决过程中,试了以下网上各种方法,均无效果. 1.包重复. ...

  5. 绕过 console-ban

    绕过 console-ban console-ban 项目介绍 console-ban 是一个高效且轻量级的 JavaScript 库,其核心功能是有效阻止用户通过浏览器的开发者工具(例如按 F12 ...

  6. Jenkins使用maven打包项目

    Jenkins使用maven打包项目 作为一名软件测试工程师,在日常工作中,我们经常需要使用Jenkins进行持续集成和持续部署(CI/CD).而Maven作为Java项目的构建工具,更是不可或缺.今 ...

  7. linux mint安装hadoop

    一.安装 安装ssh openssh-server   配置jdk环境变量~/.bashrc参考 export JAVA_HOME=/opt/jdk1.7.0_55/ export JRE_HOME= ...

  8. 【忍者算法】从图书馆找书到矩阵搜索:探索二维矩阵中的高效搜索|LeetCode第240题 搜索二维矩阵 II

    从图书馆找书到矩阵搜索:探索二维矩阵中的高效搜索 生活中的搜索策略 想象你在一个大型图书馆里找书.这个图书馆的书架是按照两个维度排列的:每个书架从左到右按书名字母顺序排列,从上到下的书架则按照出版年份 ...

  9. GUI编程之Swing

    窗口 面板  package com.yeyue.lesson04; ​ import javax.swing.*; import java.awt.*; ​ public class JFrameD ...

  10. ABB喷涂机器人IRB5400维修保养

    为最大限度地保证ABB机器人正常运行,ABB机器人普遍需要在运行6000小时后进行一次保养,特别是针对在恶劣工况与长时间在负载极限或运行极限下工作的ABB机器人,则需要每年进行一次全面ABB机器人保养 ...