【电商核心业务实战】(5) 订单系统分库分表⽅案设计与实现

发布时间:2026/8/14 22:23:03

【电商核心业务实战】(5) 订单系统分库分表⽅案设计与实现
电商核心业务实战 · 系列文章目录(1) 电商项目核心订单系统设计与实现(2) 电商促销流程设计与实现(3) 分布式唯一ID 实战(4) 订单系统读写分离方案设计与实现(5) 订单系统分库分表方案设计与实现(6) 订单系统历史数据归档方案设计与实现(7) 电商项目订单支付实战(8) 使用RocketMQ优化订单超时取消流程(9) 分布式事务在电商项目中的应用场景分析与实战分库分表除了访问MySQL的并发问题还要解决海量数据的问题很多的时候我们会使⽤分布式的存储集群因为MySQL本质上是⼀个单机数据库所以很多场景下其并不适合存储TB级别以上的数据。但是绝⼤部分电商企业的在线交易类业务⽐如订单、⽀付相关的系统还是⽆法离开MySQL的。原因是只有MySQL 之类的关系型数据库才能提供⾦融级的事务保证。⽬前的分布式事务的各种解法⽅案多少都有些不够完善。虽然 MySQL ⽆法⽀持这么⼤的数据量以及这么⾼的并发需求但是交易类系统必须⽤它来保证数据⼀致性那么如何才能解决这个问题呢这个时候我们就要考虑分⽚也就是拆分数据。如果⼀个数据库⽆法⽀撑1TB的数据那就把它拆分成100个库每个库就只有10GB的数据了。这种拆分操作就是MySQL的分库分表操作。如何规划分库分表以订单表为例⾸先,我们需要思考的问题是选择分库还是分表或者两者都有分库就是把数据拆分到不同的MySQL 数据库实例中分表就是把数据拆分到⼀个数据库的多张表⾥⾯。在考虑到底是选择分库还是分表之前,我们需要⾸先明确⼀个原则能不拆就不拆。原因很简单数据拆得越分散,并发和维护就越麻烦系统出问题的概率也就越⼤。遵循上⾯这个原则还需要进⼀步了解哪种情况适合分表哪种情况适合分库。选择分库或是分表的⽬的是解决如下两个问题。第⼀是为了解决因数据量太⼤⽽导致查询慢的问题。这⾥所说的“查询”主要是事务中的查询和更新操作因为只读的查询可以通过缓存和主从分离来解决。分表主要⽤于解决因数据量⼤⽽导致的查询慢的问题。第⼆是为了应对⾼并发的问题。如果⼀个数据库实例撑不住就把并发请求分散到多个实例中所以分库可⽤于解决⾼并发的问题。简单地说如果数据量太⼤就分表如果并发请求量⾼就分库。⼀般情况下,我们的解决⽅案⼤都需要同时做分库分表,我们可以根据预估的并发量和数据量分别计算应该拆分成多少个库以及多少张表。商城订单服务的实现数据量在设计系统我们预估订单的数量每个⽉订单2000W⼀年的订单数可达2.4亿。⽽每条订单的⼤⼩⼤致为1KB按照我们在MySQL中学习到的知识为了让B树的⾼度控制在⼀定范围保证查询的性能每个表中的数据不宜超过2000W。在这种情况下为了存下2.4亿的订单我们似乎应该将订单表分为1612往上取最近的2的幂张表。但是这样设计有个问题我们只考虑了订单表没有考虑订单详情表。我们预估⼀张订单下的商品平均为10个那既是⼀年的订单详情数可以达到24亿同样以每表2000W记录计算应该订单详情表为128120往上取最近的2的幂张⽽订单表和订单详情表虽然记录数上是⼀对⼀的关系但是表之间还是⼀对⼀订单表也要为128张。经过再三分析我们最终将订单表和订单详情表的张数定为32张。这会导致订单详情表单表的数据量达到8000W为何要这么设计呢原因我们后⾯再说。选择分片键既然决定订单系统分库分表则还有⼀个重要的问题那就是如何选择⼀个合适的列作为分表的依据该列我们⼀般称为分⽚键Sharding Key)。选择合适的分⽚键和分⽚算法⾮常重要因为其将直接影响分库分表的效果。选择分⽚键有⼀个最重要的参考因素是我们的业务是如何访问数据的⽐如我们把订单ID作为分⽚键来拆分订单表。那么拆分之后,如果按照订单ID来查询订单,就需要先根据订单ID和分⽚算法,计算所要查的这个订单具体在哪个分⽚上也就是哪个库的哪张表中然后再去那个分⽚执⾏查询操作即可。但是当⽤户打开“我的订单”这个⻚⾯的时候它的查询条件是⽤户ID由于这⾥没有订单ID因此我们⽆法知道所要查询的订单具体在哪个分⽚上也就没法查了。如果要强⾏查询的话那就只能把所有的分⽚都查询⼀遍再合并查询结果这个过程⽐较麻烦⽽且性能很差对分⻚也很不友好。那么如果是把⽤户ID作为分⽚键呢答案是也会⾯临同样的问题使⽤订单ID作为查询条件时⽆法定位到具体的分⽚上。这个问题的解决办法是在⽣成订单ID的时候把⽤户ID的后⼏位作为订单ID的⼀部分。这样按订单ID查询的时候就可以根据订单ID中的⽤户ID找到分⽚。 所以在我们的系统中订单ID从唯⼀ID服务获取ID后还会将⽤户ID的后两位拼接形成最终的订单ID。然⽽系统对订单的查询⽅式肯定不只是按订单ID或按⽤户ID查询两种⽅式。⽐如如果有商家希望查询⾃家家店的订单有与订单相关的各种报表。对订单做了分库分表就没法解决了。这个问题⼜该怎么解决呢⼀般的做法是把订单⾥数据同步到其他存储系统中然后在其他存储系统⾥解决该问题。⽐如可以再构建⼀个以店铺ID作为分⽚键的只读订单库专供商家使⽤。或者数据同步到Hadoop分布式⽂件系统HDFS中然后通过⼀些⼤数据技术⽣成与订单相关的报表。在分⽚算法上我们知道常⽤的有按范围⽐如时间范围分⽚哈希分⽚查表法分⽚。我们这⾥直接使⽤哈希分⽚对表的个数32直接取模⼀旦做了分库分表就会极⼤地限制数据库的查询能⼒原本很简单的查询分库分表之后可能就没法实现了。分库分表⼀定是在数据量和并发请求量⼤到所有招数都⽆效的情况下我们才会采⽤的最后⼀招。具体实现如何在代码中实现读写分离和分库分表呢⼀般来说有三种⽅法。纯⼿⼯⽅式修改应⽤程序的DAO层代码定义多个数据源在代码中需要访问数据库的每个地⽅指定每个数据库请求的数据源。组件⽅式使⽤像Sharding-JDBC 这些组件集成在应⽤程序内⽤于代理应⽤程序的所有数据库请求并把请求⾃动路由到对应的数据库实例上。代理⽅式:在应⽤程序和数据库实例之间部署⼀组数据库代理实例,⽐如Atlas或Sharding-Proxy。对于应⽤程序来说,数据库代理把⾃⼰伪装成⼀个单节点的MySQL实例,应⽤程序的所有数据库请求都将发送给代理代理分离请求然后将分离后的请求转发给对应的数据库实例。在这三种⽅式中⼀般推荐第⼆种使⽤分离组件的⽅式。采⽤这种⽅式,代码侵⼊⾮常少,同时还能兼顾性能和稳定性。如果应⽤程序是⼀个逻辑⾮常简单的微服务,简单到只有⼏个SQL,或者应⽤程序使⽤的编程语⾔没有合适的读写分离组件,那么也可以考虑通过纯⼿⼯的⽅式。不推荐使⽤代理⽅式(第三种⽅式原因是代理⽅式加⻓了系统运⾏时数据库请求的调⽤链路,会造成⼀定的性能损失⽽且代理服务本身也可能会出现故障和性能瓶颈等问题。代理⽅式有⼀个好处对应⽤程序完全透明。所以在我们的订单服务中使⽤了第⼆种⽅式引⼊了Sharding-JDBC考虑要同时⽀持读写分离和分库分表配置如下在分⽚键的选择上订单信息的查询往往会指定订单的ID或者⽤户ID所以oms_order的分⽚键为表中的id、member_id两个字段。⽽oms_order_item表通过order_id字段和oms_order的id进⾏关联所以它的分⽚键选择为order_id。对应在代码中有专⻔的分⽚算法实现类OmsOrderShardingAlgorithm和OmsOrderItemShardingAlgorithm分别⽤于对订单和订单详情进⾏分⽚。其中的OmsOrderShardingAlgorithm负责对订单进⾏分⽚在实现上获得订单的Id或者member_id的后两位然后对表的个数进⾏取模以定位到实际的物理oms_order表。OmsOrderItemShardingAlgorithm负责对订单详情进⾏分⽚实现上与OmsOrderShardingAlgorithm类似。

相关新闻

从Spark API使用者到性能调优专家:原理、实战与避坑指南

从Spark API使用者到性能调优专家:原理、实战与避坑指南

2026/8/14 22:23:03

如果你正在学习大数据处理,或者工作中需要处理海量数据,那么“Spark”这个名字你一定不陌生。但很多初学者,甚至一些有经验的开发者,在面对Spark时,常常陷入一个误区:以为只要会写几行 spark.read.csv() …

C语言学习之数据结构 :基本概念

C语言学习之数据结构 :基本概念

2026/8/14 22:13:03

数据结构 一 .基本概念 1.数据结构 数据结构:存储具有一种或或多种特定关系的数据的集合(如何组织和存储数据) 程序设计 数据结构 算法 2.数据与数据之间的关系 逻辑结构:数据元素与元素之间的关系 集合 :数据元素与…

基于ROS2与MoveIt的宇树G1人形机器人传统舞蹈动作规划实战

基于ROS2与MoveIt的宇树G1人形机器人传统舞蹈动作规划实战

2026/8/14 22:13:03

最近在探索人形机器人的应用边界时,一个有趣的想法冒了出来:能否让宇树G1这样先进的机器人,穿上传统服饰,演绎一段富有文化韵味的舞蹈?这不仅是技术上的挑战,更是艺术与科技融合的一次尝试。本文将完整分享…

3分钟搞定Android Studio中文汉化:终极免费汉化指南

3分钟搞定Android Studio中文汉化:终极免费汉化指南

2026/8/14 23:43:06

3分钟搞定Android Studio中文汉化:终极免费汉化指南 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 深夜打开 Android…

Copilot能换成本地吗?深入解析本地化替代方案与技术实践

Copilot能换成本地吗?深入解析本地化替代方案与技术实践

2026/8/14 23:43:06

引言:云端AI助手的便利与隐忧 Copilot的普及与价值:简述GitHub Copilot等云端AI编程助手如何改变开发者的工作流。“换成本地”的需求背景: 数据安全与隐私顾虑:企业敏感代码、个人项目不愿上传至云端。网络与延迟问题&#xff1a…

Awoo Installer:Nintendo Switch游戏安装终极指南

Awoo Installer:Nintendo Switch游戏安装终极指南

2026/8/14 23:43:06

Awoo Installer:Nintendo Switch游戏安装终极指南 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer Awoo Installer 是一款专为Nintendo …

DNS解析MX记录设置步骤和注意事项

DNS解析MX记录设置步骤和注意事项

2026/8/14 23:43:06

企业邮箱能否正常收发邮件,取决于域名系统中MX记录的配置是否正确。不少企业购买邮箱服务之后,因为MX记录设置出错,出现邮件收不到或发不出的情况,影响业务沟通。下面国科云将详细介绍MX记录的基本概念、配置步骤、优先级规则以及…

小龙虾免配置版直接使用引导,TopClaw解压即用三分钟享全部技能

小龙虾免配置版直接使用引导,TopClaw解压即用三分钟享全部技能

2026/8/14 23:43:06

说实话,我见过太多人因为“配置”这两个字,把一个好用的工具硬生生劝退了。明明是个挺方便的玩意儿,结果一看下载页面的教程,密密麻麻写了一大堆环境变量、路径设置、依赖安装,瞬间就没了折腾的心思。我以前也帮朋友远…

聚焦 AI 数据治理与可观测,AWS 中国峰会有哪些 Data for AI 技术内容可看?

聚焦 AI 数据治理与可观测,AWS 中国峰会有哪些 Data for AI 技术内容可看?

2026/8/14 23:33:06

数据团队想了解 Data for AI,AWS峰会有哪些内容可以看?五类演讲补齐数据、成本与生产治理针对数据工程、数据平台、BI分析、知识管理、AI运营团队的Data for AI体系搭建需求,2026亚马逊云科技中国峰会分论坛3:Data for AI是核心学…

比较好的亚太EMBA,问了6位校友师资差别真的挺大

比较好的亚太EMBA,问了6位校友师资差别真的挺大

2026/8/13 11:01:28

比较好的亚太EMBA核心差异先看什么?对于希望兼顾工作与系统管理能力提升的亚太区高管而言,筛选匹配度高的EMBA项目时,师资配置是决定学习体验与实际收获的核心要素之一。我们结合3-4个公开信息透明、办学历史较长的亚太区主流EMBA项目特点&am…

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

2026/8/14 10:48:24

备考海外游学的亚洲EMBA面试,核心要围绕项目国际化设计逻辑、个人跨文化管理经验匹配度两个维度准备,避免把游学模块等同于普通旅游参访的认知偏差。不少备考者花3个月对比6份资料,却容易忽略面试官对“国际视野落地能力”的考察——比如香港…

比较好的国内EMBA,问了二十位校友聊透人脉价值

比较好的国内EMBA,问了二十位校友聊透人脉价值

2026/8/13 17:17:06

比较好的国内EMBA核心差异体现在哪些方面?比较好的国内EMBA的核心长期价值,很大程度上依托于校友网络的连接质量与资源生态的活跃度,这也是不少高管在择校时优先考量的因素。我们结合3-4个市场关注度较高的项目公开信息,从课程、师…

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

2026/8/14 0:01:53

在这个数字化浪潮席卷全球的今天,企业想要在激烈的市场竞争中站稳脚跟,拥有一张好看的“数字名片”已经远远不够了。很多老板在刚开始接触互联网业务时,都有一个共同的困惑:为什么我花了钱建的网站,就像是在真空中自嗨?访客进来转了两圈就跑了,线索石沉大海,甚至连客服…

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

2026/8/14 0:01:54

在这个流量为王、视觉至上的互联网时代,对于临沂乃至整个山东乃至全国的传统中小企业来说,拥有一张精美的“数字名片”早已不再是可选项,而是生存的必答题。每当夜幕降临,沂河两岸灯火辉煌,物流之都的喧嚣逐渐沉淀为对未来的思考。我们常常听到老板们在茶余饭后探讨:为什…

Flutter与OpenHarmony实现剧本杀组队表单开发实战

Flutter与OpenHarmony实现剧本杀组队表单开发实战

2026/8/14 0:01:54

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/8 5:07:31

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/9 13:42:46

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/14 19:35:14

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…