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配置结构层次:
策略引入:
配置分片路由:
DML、DQL测试
新增订单
逻辑sql(逻辑表)
真实sql(物理表)
删除订单
按id删除,未指定分片键,会扫描所有路由
真实sql(物理表)
修改订单
逻辑sql
物理sql
指定分片键时sharding可以路由到指定表
按时间范围分页查询列表
关联表查详情
子查询查详情
踩坑
- 低版本sharding-jdbc很多复杂sql不支持,如聚合函数、子查询、union(all)
- 在分片键使用函数路由将失效,即使查询条件有分片键仍会路由全部节点。如查询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’可避免这一问题。
- 关联表笛卡尔积现象。关联查询未配置表绑定关系(绑定表分片策略需要一致)且主表、子表查询条件中没有分片件会出现笛卡尔积。配置表绑定关系或在主表、子表查询条件中使用分片键可避免这一问题。