淘客系统数据库分库分表实践:基于用户 ID 与时间维度的 Sharding 策略
淘客系统数据库分库分表实践基于用户 ID 与时间维度的 Sharding 策略大家好我是 微赚淘客系统3.0 的研发者省赚客在高并发、大数据量场景下单库单表早已无法满足淘客系统的业务需求。微赚淘客系统3.0 在日订单量突破千万级后我们对核心数据表如订单表、佣金流水表进行了分库分表改造采用基于用户 ID 与时间维度的复合 Sharding 策略有效提升了系统吞吐能力与查询效率。一、Sharding 策略设计原则我们的核心目标是写入均匀避免热点写入导致单库负载过高查询高效支持按用户 ID 快速定位分片同时兼顾时间范围查询扩容平滑未来可线性扩展分库数量而不影响历史数据。为此我们选择用户 ID 哈希取模 时间范围分表的混合策略。具体如下分库依据user_id % db_count确保同一用户的所有数据落在同一库便于事务一致性分表依据按月分表如order_202512、order_202601便于冷热分离与归档。二、ShardingSphere 配置实现我们使用 Apache ShardingSphere 5.x 作为中间件通过 Java 配置方式定义分片规则。以下为关键代码示例packagejuwatech.cn.sharding.config;importorg.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;importorg.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;importorg.springframework.stereotype.Component;importjava.util.Collection;importjava.util.stream.Collectors;ComponentpublicclassUserIdPreciseShardingAlgorithmimplementsPreciseShardingAlgorithmLong{privatestaticfinalintDB_COUNT8;OverridepublicStringdoSharding(CollectionStringavailableTargetNames,PreciseShardingValueLongshardingValue){LonguserIdshardingValue.getValue();Stringtargetds(userId%DB_COUNT);if(availableTargetNames.contains(target)){returntarget;}thrownewIllegalArgumentException(No database found for user_id: userId);}}时间维度分表算法如下packagejuwatech.cn.sharding.algorithm;importorg.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;importorg.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;importorg.springframework.stereotype.Component;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;importjava.util.Collection;ComponentpublicclassOrderTablePreciseShardingAlgorithmimplementsPreciseShardingAlgorithmLocalDateTime{privatestaticfinalDateTimeFormatterFORMATTERDateTimeFormatter.ofPattern(yyyyMM);OverridepublicStringdoSharding(CollectionStringavailableTargetNames,PreciseShardingValueLocalDateTimeshardingValue){StringsuffixshardingValue.getValue().format(FORMATTER);StringtargetTablet_order_suffix;if(availableTargetNames.contains(targetTable)){returntargetTable;}// 若目标表不存在可动态创建或回退到默认表生产环境建议预建returnt_order_default;}}三、Spring Boot 集成配置在application.yml中配置数据源与分片规则spring:shardingsphere:datasource:names:ds0,ds1,ds2,ds3,ds4,ds5,ds6,ds7ds0:type:com.zaxxer.hikari.HikariDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverjdbc-url:jdbc:mysql://db0.juwatech.cn:3306/order_db_0username:rootpassword:***# ... ds1 ~ ds7 类似配置rules:sharding:tables:t_order:actual-data-nodes:ds$-{0..7}.t_order_$-{202501..202612}database-strategy:standard:sharding-column:user_idprecise-algorithm-class-name:juwatetech.cn.sharding.config.UserIdPreciseShardingAlgorithmtable-strategy:standard:sharding-column:create_timeprecise-algorithm-class-name:juwatech.cn.sharding.algorithm.OrderTablePreciseShardingAlgorithm注意actual-data-nodes中的时间范围需根据业务预估提前配置避免运行时找不到表。四、DAO 层与实体类示例订单实体类需包含分片键packagejuwatech.cn.entity;importjava.time.LocalDateTime;publicclassOrder{privateLongid;privateLonguserId;// 分库键privateLocalDateTimecreateTime;// 分表键privateStringorderNo;privateLongcommission;// getters setters}MyBatis Mapper 示例packagejuwatech.cn.mapper;importjuwatech.cn.entity.Order;importorg.apache.ibatis.annotations.Insert;importorg.apache.ibatis.annotations.Mapper;importorg.apache.ibatis.annotations.Select;MapperpublicinterfaceOrderMapper{Insert(INSERT INTO t_order (user_id, create_time, order_no, commission) VALUES (#{userId}, #{createTime}, #{orderNo}, #{commission}))voidinsert(Orderorder);Select(SELECT * FROM t_order WHERE user_id #{userId} AND create_time BETWEEN #{startTime} AND #{endTime})ListOrderfindByUserIdAndTimeRange(Param(userId)LonguserId,Param(startTime)LocalDateTimestartTime,Param(endTime)LocalDateTimeendTime);}由于 ShardingSphere 能自动路由上述查询无需手动指定表名只要传入user_id和create_time中间件即可定位到具体库表。五、注意事项与优化点跨分片查询限制避免SELECT * FROM t_order WHERE commission 100这类无分片键的查询会导致全库扫描分页性能大偏移量分页如LIMIT 100000, 20性能差建议改用游标分页基于id lastIdDDL 同步新增字段需通过运维脚本同步到所有分库分表时间分表预建建议通过定时任务每月初自动创建下月表避免运行时异常。六、效果验证上线后单库 QPS 从 12,000 降至 1,500 以下慢查询下降 92%订单写入延迟稳定在 10ms 内。复合 Sharding 策略在保证数据隔离的同时显著提升了系统可扩展性。本文著作权归 微赚淘客系统3.0 研发团队转载请注明出处

相关新闻

计算机Java毕设实战-基于SpringBoot的蔬菜种植管理系统设计与实现精细化管控【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机Java毕设实战-基于SpringBoot的蔬菜种植管理系统设计与实现精细化管控【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/5 19:08:29 阅读更多 →
【课程设计/毕业设计】基于SpringBoot大棚蔬菜管理系统基于SpringBoot的蔬菜种植管理系统设计与实现【附源码、数据库、万字文档】

【课程设计/毕业设计】基于SpringBoot大棚蔬菜管理系统基于SpringBoot的蔬菜种植管理系统设计与实现【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/3 15:09:53 阅读更多 →
rg -n “wep_key|wep_tx_keyidx“ sta_network.cpp 其中-n是什么意思?

rg -n “wep_key|wep_tx_keyidx“ sta_network.cpp 其中-n是什么意思?

rg -n "wep_key|wep_tx_keyidx" external/wpa_supplicant_8/wpa_supplicant/aidl/sta_network.cpp 概述 在 ripgrep(简称 rg)命令中,-n 选项表示“显示行号”(--line-number)。它的作用是在输出结果的每一行匹配内容前面,标注该内容在原始文件中的具体行数。r…

2026/7/3 15:09:55 阅读更多 →

最新新闻

BERT 与 3 种传统方法对比:情感多分类任务下的精度、速度与数据需求分析

BERT 与 3 种传统方法对比:情感多分类任务下的精度、速度与数据需求分析

BERT与传统方法在情感多分类任务中的全面对比:精度、效率与数据需求的深度解析情感分析作为自然语言处理(NLP)领域的核心任务之一,其技术演进直接反映了NLP方法论的发展轨迹。本文将聚焦情感多分类这一典型场景,系统对…

2026/7/6 7:25:09 阅读更多 →
OpenCV实战:从零搭建实时人脸识别系统,附完整代码与避坑指南

OpenCV实战:从零搭建实时人脸识别系统,附完整代码与避坑指南

🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 最近在做一个智能门禁的小项目,需要用到实时人脸识别。本以为用现成的API就能搞定,结果发现对本地化部署、成本…

2026/7/6 7:21:08 阅读更多 →
明日方舟智能助手实战指南:5个核心技巧告别手动肝日常

明日方舟智能助手实战指南:5个核心技巧告别手动肝日常

明日方舟智能助手实战指南:5个核心技巧告别手动肝日常 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://git…

2026/7/6 7:21:08 阅读更多 →
XTR116与STM32的4-20mA电流环工业应用设计

XTR116与STM32的4-20mA电流环工业应用设计

1. 4-20mA电流环技术背景与XTR116特性解析工业现场最头疼的问题莫过于长距离信号传输时的干扰和衰减。我在化工厂做自动化改造时,曾遇到过传感器信号传输300米后完全失真的情况。这时候4-20mA电流环的优势就凸显出来了——电流信号对线路电阻不敏感,抗干…

2026/7/6 7:21:08 阅读更多 →
PgBouncer 的 Transaction 模式详解

PgBouncer 的 Transaction 模式详解

1. 什么是 PgBouncer?PgBouncer 是一个轻量级的 PostgreSQL 连接池工具,用于管理和复用数据库连接,从而减少频繁建立和断开连接的开销,提升数据库性能和可扩展性。2. PgBouncer 的三种连接池模式PgBouncer 支持三种主要的连接池模…

2026/7/6 7:19:07 阅读更多 →
STM32与171010550实现高效DC-DC降压转换器设计

STM32与171010550实现高效DC-DC降压转换器设计

1. 项目背景与硬件选型解析 在电力电子领域,DC-DC降压转换器(Buck Converter)是最基础也是应用最广泛的拓扑结构之一。这个项目选择了171010550电源管理IC与STM32F373VC微控制器的组合方案,这种搭配在工业电源设计中颇具代表性。 …

2026/7/6 7:19:07 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻