一、基础概念

在分库分表场景下,关联表(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. 我的程序库:HiCSUtil

    HiCSUtil是我写的一个通用程序库,地址:https://github.com/xumingxsh/HiCSUtil 该库的目标是为重用的一些功能提供一个通用的库.主要包括: 1: CBO: 提供 ...

  2. CCS(TI IDE)中英文切换

    介绍 使用CSS时会遇到中英文切换的问题,使用中文可以方便我们更好的开发,但是由于一些专业名词的原因我们有时候又需要英文环境,所以中英文切换就显得十分重要. 由于CCS基于eclipse开发,所以CC ...

  3. mysql异常处理的收集

    今天在处理mysql的存储过程,判断游标是否到了结尾,结果让返回零行的一个查询触发了,随即从网上查阅资料收集异常异常处理. MySql错误处理(一)- SQL服务器模式 导言:MySql错误处理的基础 ...

  4. 生成对抗网络GAN简介

    本文分享自天翼云开发者社区<生成对抗网络GAN简介>,作者:王****青 生成对抗网络(Generative Adversarial Networks,GAN)是一种深度敏感词模型,用于生 ...

  5. 记一次CUDA报错

    报错内容:CUDA error: device-side assert triggered 原因:使用ResNet50训练时使用了pretrained=True的模型,但实际类别数classes远超过 ...

  6. kvm实验环境的准备

    在虚拟机上最小化安装centos7,看一下我的版本 [root@kvm1 yum.repos.d]# cat /etc/redhat-release CentOS Linux release 7.9. ...

  7. 从 14 秒到 1 秒:MySQL DDL 性能优化实战

    1. 问题背景 MySQL版本:8.0.30 测试表数据量:200万 在 MySQL 中,研发人员最初执行了以下 SQL 语句,向表 t_email 中添加了一个允许为 NULL 的列 id3,并设置 ...

  8. 洛谷B3843 [GESP202306 三级] 密码合规 题解

    原题传送门 前言 咳咳,由于本人最近在备考GESP三级,所以可能会有很多水的题解.(见谅--见谅--) 由于今天刚刚重新刷了一遍此题,所以记忆犹新.(太菜了!一个测试点都能 WA ) 题目解析 简单的 ...

  9. autMan奥特曼机器人-跳过注册页面直接进入登陆页面

    1.将下面4行内容存成txt文件[注意将"账号"和"密码"等字眼替换为自己的真正账号和密码],文件名改成sets.conf,放到autman主文件夹,见下图最下 ...

  10. Postman 接口测试工具详解

    一.引言 在软件开发和测试过程中,接口测试是至关重要的环节.Postman 作为一款功能强大的接口测试工具,为开发者和测试人员提供了便捷高效的测试解决方案. 二.Postman 简介 Postman ...