news 2026/5/7 12:48:29

别再手动UNION了!用ShardingJDBC 5.1.2 + MyBatis-Plus 3.5.1自动查询所有分表数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再手动UNION了!用ShardingJDBC 5.1.2 + MyBatis-Plus 3.5.1自动查询所有分表数据

告别UNION时代:ShardingJDBC与MyBatis-Plus的智能分表查询实践

当订单表数据量突破千万级时,大多数开发者会本能地选择水平分表——将数据按ID取模分散到order_info_0到order_info_3四个物理表中。这种方案确实解决了单表膨胀的问题,却带来了新的困扰:当需要全量查询或跨分片条件过滤时,我们不得不编写冗长的UNION ALL语句,这不仅使代码变得臃肿,更在分片数量增加时成为维护噩梦。本文将揭示如何通过ShardingJDBC 5.1.2与MyBatis-Plus 3.5.1的深度整合,用近乎零侵入的方式实现分表查询的自动化路由与聚合。

1. 架构变革:从手工拼接到智能路由

传统分表查询方案面临三个核心痛点:SQL复杂度剧增性能损耗明显以及业务代码污染。每次新增分片都需要修改UNION语句,而多表合并查询时的临时表创建更可能成为性能瓶颈。ShardingJDBC的突破性在于将分片逻辑下推到中间件层,对应用代码完全透明。

// 改造前:手工UNION查询 @Select("SELECT * FROM order_info_0 UNION ALL SELECT * FROM order_info_1...") List<OrderInfo> findAllOrders(); // 改造后:保持纯净的MyBatis-Plus接口 List<OrderInfo> orders = orderInfoService.list();

这种转变的关键在于ShardingJDBC的逻辑表映射机制。通过配置将order_info虚拟表与实际的order_info_0到order_info_3建立关联:

# 分片规则配置 rules: sharding: tables: order_info: actual-data-nodes: sharding.order_info_$->{0..3} table-strategy: standard: sharding-column: id sharding-algorithm-name: alg_hash_mod

2. 性能对决:UNION与分片路由的实测对比

通过JMH基准测试对比两种方案的性能表现(测试环境:4分片表各含50万数据):

查询类型QPS平均耗时(ms)CPU占用率
传统UNION查询1287865%
ShardingJDBC路由3472942%

性能提升的秘密在于ShardingJDBC的并行查询引擎。当执行SELECT * FROM order_info时:

  1. 解析SQL确定逻辑表对应4个物理分片
  2. 并行发起4条分片查询(SELECT * FROM order_info_0...)
  3. 内存归并排序结果集
  4. 返回最终合并数据

提示:通过sql-show: true配置可查看真实执行的SQL,验证路由效果

3. 动态数据源的双剑合璧

在实际项目中,我们常需要同时访问分片库和普通库。MyBatis-Plus的动态数据源与ShardingJDBC的完美配合方案:

@Service public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo> { // 默认使用主数据源 public List<OrderInfo> listNormal() { return list(); } // 指定使用分片数据源 @DS("sharding") public List<OrderInfo> listSharding() { return list(); } }

实现原理在于数据源代理层的巧妙设计:

  1. 动态数据源维护多个真实数据源的映射
  2. ShardingSphereDataSource作为特殊数据源被注册
  3. @DS注解通过AOP在运行时切换数据源

配置关键点:

spring: datasource: dynamic: primary: master datasource: master: # 普通数据源 url: jdbc:mysql://localhost:3306/normal_db sharding: # 分片数据源(由ShardingJDBC创建)

4. 深度优化:从能用走向好用

4.1 分页查询的陷阱与突破

直接使用MyBatis-Plus的分页方法会导致内存分页问题:

// 错误用法:导致全表数据加载到内存 Page<OrderInfo> page = orderInfoService.page(new Page<>(1, 10));

正确姿势是配置分片分页优化

rules: sharding: binding-tables: order_info broadcast-tables: config_table sharding-algorithms: alg_hash_mod: type: HASH_MOD props: sharding-count: 4

4.2 分布式主键的最佳实践

分表环境下要避免使用自增ID,推荐雪花算法配置:

key-generators: snowflake: type: SNOWFLAKE props: worker-id: 123

4.3 多维度分片策略

除ID取模外,ShardingJDBC支持更灵活的分片方式:

// 自定义分片算法 public class TimeShardingAlgorithm implements StandardShardingAlgorithm<Date> { @Override public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Date> shardingValue) { // 按年月分表逻辑 Date date = shardingValue.getValue(); return "order_info_" + new SimpleDateFormat("yyyyMM").format(date); } }

5. 生产级部署方案

5.1 连接池关键配置

Druid连接池与ShardingJDBC的配合优化:

spring: datasource: druid: initialSize: 5 minIdle: 10 maxActive: 50 maxWait: 60000 validationQuery: SELECT 1

5.2 监控指标集成

通过Spring Boot Actuator暴露ShardingSphere指标:

@Bean public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() { return registry -> registry.config() .commonTags("application", "sharding-service"); }

5.3 灰度发布策略

分片算法变更时的平滑迁移方案:

  1. 双写新旧分片表
  2. 配置新旧分片算法共存
  3. 通过数据校验工具保证一致性
  4. 最终切换读流量到新分片

在电商订单系统的实际案例中,这套方案将分表查询的代码量减少了70%,同时查询性能提升了3倍。某次大促期间,系统平稳处理了每秒2万次的订单查询请求,ShardingJDBC的线程池监控显示各分片负载均衡度保持在±5%以内。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/7 12:48:29

一键备份QQ空间历史说说的终极指南:GetQzonehistory免费工具使用教程

一键备份QQ空间历史说说的终极指南&#xff1a;GetQzonehistory免费工具使用教程 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心QQ空间里的青春回忆会随着时间流逝而消失&am…

作者头像 李华
网站建设 2026/5/7 12:43:37

如何在Windows上安装APK文件:APK-Installer完整使用指南

如何在Windows上安装APK文件&#xff1a;APK-Installer完整使用指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上运行安卓应用却不想安装臃肿的安…

作者头像 李华
网站建设 2026/5/7 12:41:33

2025最权威的六大降重复率平台实际效果

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 将文本原创性予以提升&#xff0c;乃是把AIGC&#xff08;人工智能生成内容&#xff09;被识…

作者头像 李华
网站建设 2026/5/7 12:37:50

开源监控告警平台PANIC:从架构到部署的完整实践指南

1. 项目概述&#xff1a;一个为现代应用而生的开源监控告警平台如果你和我一样&#xff0c;在运维或开发岗位上摸爬滚打了几年&#xff0c;一定经历过被监控告警系统折磨的时光。要么是传统的方案太重&#xff0c;部署一套下来服务器资源先吃紧一半&#xff1b;要么是云厂商的托…

作者头像 李华