sharding-jdbc实践,实现按时间分库分表

随着业务增长,单库单表不再适用,本文介绍了如何利用Sharding-JDBC实现订单系统的分库分表,包括依赖配置、分片策略、DML和DQL操作,以及解决聚合函数、子查询支持和关联查询中遇到的问题。同时提供代码示例和注意事项,如需完整内容需查看Git仓库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sharding-jdbc实践,实现订单按年分库、按季度分表

背景:随着业务激增、用户量上升,目前单库单表已无法满足高效率处理业务需求。根据目前订单量和增量曲线决定将订单业务相关表进行分库分表。

项目依赖

spring-boot-starter-parent 2.3.1.RELEASE
mysql-connector-java 8.0.13
mybatis-plus-boot-starter 3.4.1
shardingsphere-jdbc-core-spring-boot-starter 5.1.2

项目依赖

数据源、连接池配置

数据源、连接池配置

分片算法

策略类:
分片算法策略类
yml配置结构层次:
yml配置结构层次
策略引入:
引入分片算法配置分片路由:
指定分片路由

DML、DQL测试

新增订单
新增订单、订单详情
逻辑sql(逻辑表)
新增逻辑sql真实sql(物理表)
新增真实sql
删除订单
删除订单、订单详情
删除逻辑sql
按id删除,未指定分片键,会扫描所有路由
真实sql(物理表)
删除真实sql(物理表)
修改订单
修改订单
逻辑sql
修改逻辑sql
物理sql
指定分片键时sharding可以路由到指定表
修改物理sql
按时间范围分页查询列表
分页计数
逻辑sql分页真实sql
关联表查详情
关联表查详情
子查询查详情
查询订单表查询订单详情表

踩坑

  1. 低版本sharding-jdbc很多复杂sql不支持,如聚合函数、子查询、union(all)
  2. 在分片键使用函数路由将失效,即使查询条件有分片键仍会路由全部节点。如查询2023-06-01的订单:select * from order_info where date(create_time) = ‘2023-06-01’,将sql调整为select * from order_info where create_time between ‘2023-06-01 00:00:00’ and '2023-06-01 23:59:59’可避免这一问题。
  3. 关联表笛卡尔积现象。关联查询未配置表绑定关系(绑定表分片策略需要一致)且主表、子表查询条件中没有分片件会出现笛卡尔积。配置表绑定关系或在主表、子表查询条件中使用分片键可避免这一问题。

代码示例

相关代码及配置中使用的数据表结构sql已上传git仓库,需要自行下载,有异议或指导欢迎提Issue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值