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

巧用 ID 尾碼實現 MySQL 大量數據隨機批量更新:效能提升兩個數量級

     編輯:MySQL 資料庫相關知識

問題背景

  • 需求:將文章表 ddmx_addonarticle 的 templet (模板) 欄位隨機分配給 10 種模板
  • 傳統做法:讀全表 → PHP 隨機 → 逐行 UPDATE → N 條 UPDATE,效能極差

創新解法:ID 尾碼分桶 + 批量 UPDATE

$templates = ['tpl1','tpl2',...,'tpl10'];  // 10 個模板
$total = count($templates);

for ($i = 0; $i < $total; $i++) {
    $tpl = $templates[mt_rand(0, $total - 1)];  // 隨機取一個模板
    $dsql->ExecuteNoneQuery(
        "UPDATE `ddmx_addonarticle` SET `templet` = '$tpl' WHERE RIGHT(`aid`, 1) = '$i'"
    );
}

核心原理

維度逐行 UPDATE尾碼分桶批量 UPDATE
SQL 執行次數N (行數)10 (固定,等於模板數)
索引利用主鍵點查全表掃描 (但僅 10 次)
網路往返N 次10 次
事務開銷N 個隱式事務10 個隱式事務
隨機度完全隨機按尾碼分布,近似均勻

進階優化:擴大分桶基數

-- 取尾 2 位 (00-99),共 100 桶,隨機抽取 30 個桶更新
UPDATE `ddmx_addonarticle` SET `templet` = 'tpl_x' WHERE RIGHT(`aid`, 2) IN ('01','07','13',...);
  • 桶越多 → 分布越均勻 → 隨機感越強
  • 桶越少 → SQL 越少 → 效能越高
  • 建議:桶數 = 模板數 × 5~10,平衡隨機度與效能

適用場景與限制

  • ✅ 大量數據「近似隨機」屬性更新 (模板、標籤、分組、狀態)
  • ✅ 自增 ID 分布均勻 (無大量刪除導致稀疏)
  • ❌ 業務要求嚴格均勻/可重現 隨機分布
  • ❌ 非數字主鍵 (UUID、字串 ID) — 需改用 CRC32(id) % N 等 Hash 分桶

更通用的 Hash 分桶寫法 (支援任意主鍵)

-- MySQL 8.0+ 通用隨機分桶更新
UPDATE `articles`
SET `templet` = ELT(1 + (CRC32(`id`) % 10), 'tpl1','tpl2',...,'tpl10')
WHERE `status` = 'published';

CRC32 計算快、分布均勻,ELT 將 0-9 映射到模板陣列,單條 SQL 完成全表隨機分配,無需應用層循環。

總結

「ID 尾碼分桶」是無需新增欄位、無需應用層循環、單條 SQL 批量更新的極簡技巧。配合 CRC32/MD5 Hash 可推廣至任意主鍵類型,是大量數據「偽隨機」屬性賦值的高效利器。

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