首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

億級資料 MySQL 分表實戰:CRC32 雜湊分表 100 張 + MERGE 引擎統一視圖

     編輯:MySQL 資料庫相關知識

面對億級資料量,單表寫入/查詢效能瓶頸明顯。作者實踐 CRC32 雜湊分表 100 張 + MERGE 引擎統一視圖 方案,詳細記錄建表腳本、分表路由函數、MERGE 視圖建立與應用層適配要點。

1. 批量建立 100 張分表

$sql = "CREATE TABLE `code_%d` (
  `full_code` CHAR(10) NOT NULL,
  `create_time` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`full_code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8";

for ($i = 0; $i <= 99; $i++) {
    mysql_query(sprintf($sql, $i));
}
  • 引擎選 **MyISAM**:分表場景下無交易需求,MyISAM 空間效率高、讀取快。
  • 主鍵 full_code 為 CHAR(10),固定長度利於分表雜湊計算。

2. 分表路由函數:CRC32 取模

function getHashTable($prefix, $code, $shards = 100) {
    $hash = sprintf("%u", crc32($code));      // 無符號整數
    $shardId = intval(fmod($hash, $shards));  // 取模分片
    return $prefix . '_' . $shardId;          // 如 code_42
}

// 使用示例
$tableName = getHashTable('code', $fullCode);
$sql = "INSERT INTO `$tableName` (full_code, create_time) VALUES ('$fullCode', $now)";
mysql_query($sql);
  • crc32() 速度極快、分佈均勻、跨語言一致(PHP/Java/Python/Go 同算法)。
  • sprintf("%u") 確保無符號,避免負數導致模運算異常。
  • fmod() 處理大整數取模精確。

3. MERGE 引擎建立統一邏輯視圖

CREATE TABLE IF NOT EXISTS `code` (
  `full_code` CHAR(10) NOT NULL,
  `create_time` INT UNSIGNED NOT NULL,
  INDEX (`full_code`)
) ENGINE=MERGE UNION=(code_0,code_1,code_2,...,code_99) INSERT_METHOD=LAST;
  • ENGINE=MERGE:邏輯視圖,**不儲存資料**,查詢時自動路由至子表。
  • UNION=(...):列舉所有 100 張子表名稱。
  • INSERT_METHOD=LAST:INSERT INTO code ... 導向最後一張子表(code_99),**實際應用應禁用視圖寫入,改用路由函數寫入具體分表**。

4. 查詢模式與效能

查詢類型SQL 示例效能特徵
主鍵精確查詢SELECT * FROM code_42 WHERE full_code='ABC123'單表索引查找,極快
路由函數指定查詢應用層計算表名 → 直查分表零開銷,推薦寫入/點查
全表掃描/聚合SELECT COUNT(*) FROM codeMERGE 引擎並行掃描 100 表,較單表快
跨分頁排序SELECT * FROM code ORDER BY create_time DESC LIMIT 10需應用層合併排序,MERGE 不支援跨表 ORDER BY

5. 遷移與擴容策略

  • 擴容至 200 表: 新建 code_100~code_199,修改路由函數 $shards=200,**歷史資料需遷移**(按新規則重新分表)。
  • 一致性雜湊改良: 採用 ketama 演算法,擴容時僅遷移 1/N 資料。
  • 中間件方案: 生產環境建議上 MyCat、ShardingSphere、Vitess 透明化分表邏輯。

6. 關鍵限制與避坑

  • MERGE 表**不支援外鍵、交易、全文索引、REPLACE**。
  • 子表結構**必須完全一致**,ALTER 需同步 100 表(可用 pt-online-schema-change 批量)。
  • INSERT_METHOD=LAST 易導致熱點寫入,**嚴禁應用直接寫入 MERGE 表**。
  • MyISAM 無交易,跨分表操作無原子性保障。
  • 分表鍵選擇關鍵:高基數、均勻分佈、查詢頻繜帶該鍵**(本例 full_code 滿足)。

總結

CRC32 分表 + MERGE 視圖是**低成本、原生 MySQL、無中間件**的分表入門方案。適合:

  • 單表超 5000 萬行、寫入/點查為主。
  • 團隊暫無中間件運維能力。
  • 可接受應用層路由邏輯耦合。

長期演進建議引入分庫分表中間件,實現透明化、線上擴容、分散式事務支援。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved