10亿订单如何做分库分表?

亿级订单表数据存储 海量数据的处理问题:订单数据越来越多(亿级),查询越来越慢,如何处理? 分库分表会带来哪些副作用?可能的解决方式有哪些? 目前经常使用的关系型数据库如MySQL、SQL Server等,都是以“行”为单位进行存储,为了快速检索,也都采用了B树或其他索引技术。 从原理上来讲,表中的数据越多,索引树的范围越大,磁盘读取也越多,性能也就越低。 从实践角度来看,一般以百万到千万作为一个表的存储量级,超出该... 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产Star破10w的开源项目,前端包括管理后台、微信小程序,后端支持单体、微服务架构

RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRM、AI大模型、IoT物联网等功能:

  • 多模块:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • 微服务:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK17/21+SpringBoot3、JDK8/11+Spring Boot2双版本 

来源:苏三说技术


场景痛点 :某电商平台的MySQL订单表达到7亿行时,出现致命问题:

-- 简单查询竟需12秒!
SELECT * FROM orders WHERE user_id=10086 LIMIT 10;

-- 统计全表耗时278秒
SELECT COUNT(*) FROM orders;

核心矛盾 :

  1. B+树索引深度达到5层,磁盘IO暴增。

  2. 单表超200GB导致备份时间窗突破6小时。

  3. 写并发量达8000QPS,主从延迟高达15分钟。

关键认知 :当单表数据量突破5000万行 时,就该启动分库分表设计预案。

那么问题来了,假如现在有10亿的订单数据,我们该如何做分库分表呢?

今天这篇文章就跟大家一起聊聊这个问题,希望对你会有所帮助。

1 分库分表核心策略

1.1 垂直拆分:先给数据做减法

优化效果 :

  • 核心表体积减少60%

  • 高频查询字段集中提升缓存命中率

1.2 水平拆分:终极解决方案

分片键选择三原则 :

  1. 离散性 :避免数据热点(如user_id优于status)

  2. 业务相关性 :80%查询需携带该字段

  3. 稳定性 :值不随业务变更(避免使用手机号)

分片策略对比 :

策略类型

适用场景

扩容复杂度

示例

范围分片

带时间范围的查询

简单

create_time按月分表

哈希取模

均匀分布

困难

user_id % 128

一致性哈希

动态扩容

中等

使用Ketama算法

基因分片

避免跨分片查询

复杂

从user_id提取分库基因

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

2 基因分片

针对订单系统的三大高频查询:

  1. 用户查历史订单(user_id)

  2. 商家查订单(merchant_id)

  3. 客服按订单号查询(order_no)

解决方案 :

Snowflake订单ID改造 :

// 基因分片ID生成器
publicclass OrderIdGenerator {
    // 64位ID结构:符号位(1)+时间戳(41)+分片基因(12)+序列号(10)
    privatestaticfinalint GENE_BITS = 12;
    
    public static long generateId(long userId) {
        long timestamp = System.currentTimeMillis() - 1288834974657L;
        // 提取用户ID后12位作为基因
        long gene = userId & ((1 << GENE_BITS) - 1); 
        long sequence = ... // 获取序列号
        
        return (timestamp << 22) 
             | (gene << 10) 
             | sequence;
    }
    
    // 从订单ID反推分片位置
    public static int getShardKey(long orderId) {
        return (int) ((orderId >> 10) & 0xFFF); // 提取中间12位
    }
}

路由逻辑 :

// 分库分表路由引擎
publicclass OrderShardingRouter {
    // 分8个库 每个库16张表
    privatestaticfinalint DB_COUNT = 8; 
    privatestaticfinalint TABLE_COUNT_PER_DB = 16;
    
    public static String route(long orderId) {
        int gene = OrderIdGenerator.getShardKey(orderId);
        int dbIndex = gene % DB_COUNT;
        int tableIndex = gene % TABLE_COUNT_PER_DB;
        
        return"order_db_" + dbIndex + ".orders_" + tableIndex;
    }
}

关键突破 :通过基因嵌入,使相同用户的订单始终落在同一分片,同时支持通过订单ID直接定位分片

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

3 跨分片查询

3.1 异构索引表方案

Elasticsearch索引表结构 :

{
  "order_index": {
    "mappings": {
      "properties": {
        "order_no": { "type": "keyword" },
        "shard_key": { "type": "integer" },
        "create_time": { "type": "date" }
      }
    }
  }
}
4.2 全局二级索引(GSI)
-- 在ShardingSphere中创建全局索引
CREATE SHARDING GLOBAL INDEX idx_merchant ON orders(merchant_id) 
    BY SHARDING_ALGORITHM(merchant_hash) 
    WITH STORAGE_UNIT(ds_0,ds_1);

4、数据迁移

双写迁移方案 :

灰度切换步骤 :

  1. 开启双写(新库写失败需回滚旧库)

  2. 全量迁移历史数据(采用分页批处理)

  3. 增量数据实时校验(校验不一致自动修复)

  4. 按用户ID灰度流量切换(从1%到100%)

5、避坑指南

5.1 热点问题

双十一期间发现某网红店铺订单全部分到同一分片。

解决方案:引入复合分片键 (merchant_id + user_id) % 1024

5.2 分布式事务

这里的分布式事务使用的RocketMQ的数据最终一致性方案:

// 最终一致性方案
@Transactional
public void createOrder(Order order) {
   orderDao.insert(order); // 写主库
   rocketMQTemplate.sendAsync("order_create_event", order); // 发消息
}

// 消费者处理
@RocketMQMessageListener(topic = "order_create_event")
public void handleEvent(OrderEvent event) {
   bonusService.addPoints(event.getUserId()); // 异步加积分
   inventoryService.deduct(event.getSkuId()); // 异步扣库存
}

5.3 分页陷阱

跨分片查询页码错乱。

解决方案:改用ES聚合查询或业务折衷方案(只查最近3个月订单)。

6 终极架构方案

性能指标 :

场景

拆分前

拆分后

用户订单查询

3200ms

68ms

商家订单导出

超时失败

8s完成

全表统计

不可用

1.2s(近似)

总结

  1. 分片键选择大于努力 :基因分片是订单系统的最佳拍档。

  2. 扩容预留空间 :建议初始设计支持2年数据增长。

  3. 避免过度设计 :小表关联查询远比分布式Join高。效

  4. 监控驱动优化 :重点关注分片倾斜率>15%的库。

真正的架构艺术,是在分与合之间找到平衡点。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
上亿级订单如何用Mysql实现分库分表呢?看看这个设计思路吧 一、背景 随着公司业务增长,如果每天1000多万笔订单的话,3个月将有约10亿的订单量,之前数据库采用单库单表的形式已经不满足于业务需求,数据库改造迫在眉睫。 二、订单数据如何划分 我们可以将订单数据划分成两大类型:分别是热数据和冷数据。 热数据:3个月内的订单数据,查询实时性较高; 冷数据A:3个月 ~ 12个月前的订单数据,查询频率不高; 冷数据B:1年前的订单数据,几乎不会查询,只有偶尔的查询需求; 可能这里有个疑惑为什么要将冷数据分成两类,因为根据实际场景需求,用户基本不会去... 阅读详情

相关推荐

ENSP从下载到运行:用虚拟机搭建华为认证实验环境全流程(含USG6000V镜像配置)

本文提供了一份详细的华为ENSP仿真平台从下载、安装到配置USG6000V防火墙镜像的完整指南。内容涵盖前置软件安装、ENSP主程序配置、核心设备镜像导入及虚拟机资源分配策略,旨在帮助网络工程师和学习者快速搭建一个稳定、功能齐全的华为认证实验环境,为备考和模拟企业网络部署打下坚实基础。

weixin_29230865的博客 539

10亿数据量订单的分库分表最佳实践

胡弦,视频号2023年度优秀创作者,互联网大厂P8技术专家,Spring Cloud Alibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者,资深架构师,技术负责人,极客时间训练营讲师,四维口袋KVP最具价值技术专家,技术领域专家团成员,2021电子工业出版社年度优秀作者,获得2023电子工业出版技术成长领路人称号,荣获2024年电子工业出版社博文视点20周年荣誉专家称号,2024电子工业出版社年度优秀作者。

huxian1234的专栏 1596

基于OpenCV的驾驶疲劳检测与预警系统设计

PERCLOS(Percentage of Eye Closure)是一种基于眼睑闭合程度的疲劳度量指标。在基于OpenCV的驾驶疲劳检测与预警系统设计中,PERCLOS可以用于检测驾驶员的眼睑闭合程度,以判断其是否疲劳。该函数用于检测视频流中人脸的疲劳程度。具体地,该函数通过检测人脸的眼睛和嘴巴的状态来评估人脸的疲劳程度。眼睛状态是通过计算眼睛的长宽比(eyear)来判断,如果长宽比小于某个阈值,则认为眼睛闭合,表示人处于疲劳状态。

2301_79810943的博客 2328

10亿订单分库分表

《10亿订单数据的分库分表实战方案》摘要 面对7亿行MySQL订单表导致的查询性能骤降(简单查询12秒、全表统计278秒),本文提出完整的分库分表解决方案。核心策略包括:1)垂直拆分减少60%表体积;2)水平拆分采用基因分片技术,通过改造SnowflakeID嵌入12位用户基因,确保相同用户订单落在同一分片;3)配套异构索引表和全局二级索引解决跨分片查询问题。方案实施需注意:双写迁移保障数据一致性、RocketMQ实现分布式事务、ES解决分页陷阱。最终使查询性能从3200ms降至68ms,全表统计从不可用优

xdpcxq的专栏 876

【汽车故障诊断2】从标准到实战:解码DTC格式背后的诊断逻辑

本文深入解析汽车诊断故障码(DTC)的格式与逻辑,对比了OBD-II标准(如ISO 15031-6)的5字符格式与UDS协议(ISO 14229-1)下更丰富的3字节格式。文章从国际标准出发,结合实战案例,阐述了DTC如何作为汽车电子系统的“体检报告”,帮助工程师和维修技师精准定位故障,并详细解读了UDS 19服务如何读取和管理DTC状态。

berry的博客 713

MacOS M芯片部署ComfyUI:从环境排雷到插件生态一站式指南

本文为MacOS M系列芯片用户提供了一份详尽的ComfyUI部署指南。文章深入剖析了因架构差异导致的常见安装报错根源,并给出了基于MPS后端的正确PyTorch安装命令。从创建纯净Python虚拟环境、分步安装依赖,到验证GPU加速,手把手指导完成部署。同时,还推荐了包括管理器、汉化在内的必备插件,以完善使用生态,帮助用户一站式解决从环境搭建到效率提升的所有问题。

weixin_29261711的博客 995

10亿订单如何分库分表?

场景痛点-- 简单查询竟需12秒!-- 统计全表耗时278秒核心矛盾B+树索引深度达到5层,磁盘IO暴增。单表超200GB导致备份时间窗突破6小时。写并发量达8000QPS,主从延迟高达15分钟。关键认知:当单表数据量突破5000万行时,就该启动分库分表设计预案。那么问题来了,假如现在有10亿的订单数据,我们该如何做分库分表呢?今天这篇文章就跟大家一起聊聊这个问题,希望对你会有所帮助。分片键选择大于努力:基因分片是订单系统的最佳拍档。扩容预留空间:建议初始设计支持2年数据增长。避免过度设计。

sdgfafg_25的博客 983

解读 2025《高质量数据集 质量评测规范》

《高质量数据集质量评测规范》为2025年数据质量评估提供标准化框架,适用于政府部门、AI企业、数据服务商等行业主体。规范以"说明文档-数据质量-模型应用"三维体系为核心:明确定义高质量数据集分类,细化各项指标要求(包括文档完整性、数据规范性、应用多样性等),并提供具体评分细则(百分制,90分达标)和计算方法。附录补充多模态数据处理细则,旨在建立可操作的质量评估标准,保障优质数据供给流通。

cdfunlove的博客 1892

用MySQL存下亿级数据——分库分表

首先,我们需要明白分库分表要解决什么问题。在如今数据量爆炸的时代,业务的数据记录动不动就是以亿计,单表必定是存不下了。

qq_39039639的博客 1964

DeepLabv3+改进专栏

🔥【DeepLabv3+改进专栏!探索语义分割新高度】🌟 你是否在为图像分割的精度与效率发愁?📢 本专栏重磅推出:✅ 独家改进策略:融合注意力机制、轻量化设计与多尺度优化✅ 即插即用模块:ASPP+升级、解码器。

AIcurator的博客 2576

Oracle EBS(R12+)通过Multi-Org 多组织架构、Multi-Ledger 多账簿、SLA 子分类账会计、多币种引擎、多会计政策并行五大核心能力,为跨国企业提供一体化、自动化、合规的

Oracle EBS(R12+)提供全球会计核算解决方案,通过Multi-Org多组织架构实现跨国集团数据隔离与共享,支持四层组织结构(业务组→法律实体→经营单位→库存组织)。Multi-Ledger多账簿功能允许一笔业务多准则自动核算,包含主账簿、辅助账簿和报告币种。系统内置多币种处理引擎,覆盖全流程货币业务,支持自动重估、再计量和折算。通过SLA子分类账会计实现多会计政策并行处理,满足不同国家会计准则和税制要求。该方案可同时支持本地法定、集团合并及管理分析需求,实现全球财务数据集中管理,提升合规性和运营

金牌架构师 554

上亿订单如何做分库分表?

本文针对亿级订单系统的性能瓶颈,提出分库分表解决方案。采用先分库后分表策略,将订单数据分散到4个数据库共128张表中,通过取模运算实现数据路由。Java端通过工具类动态计算库表位置,配合MyBatis动态SQL实现查询。同时给出SQL自动建表脚本,并强调查询优化、全局ID生成、事务处理等关键点。方案有效解决了单表过大导致的查询慢、写入压力大等问题,使系统具备支撑十亿级订单的能力。

勤劳的小琪 1009

手把手教你学Simulink——基于全桥 LLC 谐振变换器的双向 DC-DC 建模与仿真

本文详细介绍了基于Simulink的双向全桥LLC谐振变换器建模与仿真方法。内容涵盖:1)LLC谐振变换器背景与双向化挑战;2)系统架构设计及关键数学推导(FHA增益分析、双向控制逻辑);3)Simulink建模步骤(功率级搭建、PWM生成、同步整流实现);4)仿真结果分析(正向/反向工作验证、ZVS特性);5)工程实践建议(增益微调、代码生成与HIL测试)。通过手把手教学,帮助读者掌握950V↔48V双向LLC变换器的完整设计流程,实现高效率能量双向流动的同时保持软开关特性,适用于储能系统、车载充电等应用

MHD0815的博客 179

10亿级订单系统分库分表设计思路!

作者 :架构小黑 | 微信公众号:架构师之巅一、背景随着公司业务增长,如果每天1000多万笔订单的话,3个月将有约10亿的订单量,之前数据库采用单库单表的形式已经不满足于...

Java后端技术 7235

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据库改造:怎样用MySQL对10亿级订单量进行分库分表?

一、背景 随着公司业务增长,如果每天1000多万笔订单的话,3个月将有约10亿的订单量,之前数据库采用单库单表的形式已经不满足于业务需求,数据库改造迫在眉睫。 二、订单数据如何划分 我们可以将订单数据划分成两大类型:分别是热数据和冷数据。 热数据:3个月内的订单数据,查询实时性较高; 冷数据A:3个月 ~ 12个月前的订单数据,查询频率不高; 冷数据B:1年前的订单数据,几乎不会查询,只有偶尔的查询需求; 可能这里有个疑惑为什么要将冷数据分成两类,因为根据实际场景需求,用户基本不会去查...

wdj_yyds的博客 3158

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

从 3.6 亿订单表到毫秒级查询:分库分表指南

最后,我想强调:分库分表不是 “越拆越好”,而是 “适度拆分”。能不分就不分:如果单表数据量≤1000 万,先优化索引、SQL、读写分离,分库分表是最后一步;先分表再分库:单表数据量过大时,先水平分表,分表后仍有单库压力,再分库;业务优先于技术:所有拆分规则都要围绕业务场景,不要为了 “技术炫酷” 而过度设计。希望这篇文章能帮你搞懂分库分表,下次遇到大数据量瓶颈时,能从容应对。如果有具体场景想交流,欢迎在评论区留言!

weixin_46515691的博客 1267

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 中国四大软件外包公司
下一篇: 最近,后端这招聘市场是真癫了。。
公众号-芋道源码
博客等级 码龄10年 1636粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值