成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

10億訂單如何做分庫分表?

數據庫 其他數據庫
關鍵認知:當單表數據量突破5000萬行時,就該啟動分庫分表設計預案。那么問題來了,假如現在有10億的訂單數據,我們該如何做分庫分表呢?

前言

場景痛點:某電商平臺的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提取分庫基因

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直接定位分片

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%的庫。


真正的架構藝術,是在分與合之間找到平衡點。

責任編輯:武曉燕 來源: 蘇三說技術
相關推薦

2025-02-21 08:20:33

2018-03-14 09:49:35

數據庫遷移

2022-11-30 07:58:10

支付業務系統分庫分表

2022-10-10 17:37:59

分庫分表訂單業務

2019-04-25 10:40:02

分庫分表MySQL數據庫

2022-06-30 07:34:46

分庫分表外賣訂單系統

2019-06-05 14:30:21

MySQL數據庫索引

2021-09-08 09:48:39

數據庫工具技術

2020-07-28 09:04:09

NewSQL分庫分表

2020-07-30 17:59:34

分庫分表SQL數據庫

2019-11-12 09:54:20

分庫分表數據

2024-11-22 15:32:19

2022-07-11 08:16:47

NewSQL關系數據庫系統

2022-05-23 09:41:27

分庫分表數據庫算法

2022-11-18 09:39:48

分庫分表

2021-08-31 20:21:11

VitessMySQL分庫

2023-08-11 08:59:49

分庫分表數據數據庫

2020-11-18 09:39:02

MySQL數據庫SQL

2022-10-09 18:14:31

訂單系統分庫分表

2020-11-17 08:08:34

分庫分表
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级aaaaaa毛片免费同男同女 | 亚洲精品一区二 | 国产不卡视频 | 日本精品一区二区三区视频 | 欧美一级二级视频 | 黄色网址在线播放 | 午夜av电影院 | 综合精品久久久 | 久久久美女 | 超碰成人免费 | 成人午夜| 中文字幕一区二区三区四区五区 | 黄色小视频入口 | 成人免费视频久久 | 亚洲天堂色 | 亚洲啊v在线| 免费天天干| 欧美极品视频在线观看 | 亚洲精品一区二区三区 | 日韩精品在线一区二区 | 91激情电影 | 综合久久一区 | 亚洲社区在线 | 911精品国产 | 成人做爰9片免费看网站 | 久久se精品一区精品二区 | 国产欧美精品一区二区三区 | 精品欧美激情精品一区 | 狠狠干狠狠操 | 日韩a在线观看 | 在线观看免费福利 | 中文字幕在线免费观看 | 日韩成人在线一区 | 久久久无码精品亚洲日韩按摩 | 亚洲日韩第一页 | 欧美日韩视频在线播放 | 欧美高清性xxxxhdvideosex | av中文天堂| 亚洲风情在线观看 | 欧美福利 | 中文字幕一区二区在线观看 |