首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 主鍵生成機制效能實測:AUTO_INCREMENT vs UUID vs 多序列對比

     編輯:MySQL 綜合教學

測試環境

  • 記憶體:4G
  • IO:RAID 1+0, SCSI Ultra 320 + BBWC
  • MySQL:5.0.32
  • OS:Linux 2.6.16 x86_64
  • InnoDB Buffer:128M

三種方案

方案主鍵定義插入語句
一:單一自增a INT AUTO_INCREMENT PRIMARY KEYINSERT ... VALUES('aaa...')
二:觸發器轉 16 序列a INT AUTO_INCREMENT PRIMARY KEY + BEFORE INSERT 觸發器重算 new.a同方案一
三:UUIDa VARCHAR(64) PRIMARY KEYINSERT ... VALUES(UUID(), 'aaa...')

每方案 20 執行緒並發插入,字串欄位固定 200 字元 'a'。

測試結果

方案插入速度 (行/秒)佔用空間 (MB)
一:單一自增3,965245
二:16 序列3,777245
三:UUID2,580571

結論分析

  1. 單一自增最優:速度最快、空間最小。InnoDB 聚簇索引順序寫入,頁分裂極少,並發熱點在現代版本(5.6+)已透過 innodb_autoinc_lock_mode=2 等機制大幅緩解。
  2. 多序列無顯著優勢:速度、空間與單序列持平,額外增加觸發器複雜度,不推薦。
  3. UUID 顯著劣勢:隨機寫入導致頁分裂頻繁、索引碎片化、空間膨脹 2.3 倍、速度慢 35%。

補充:觸發器方案的 LAST_INSERT_ID() 陷阱

觸發器修改 new.a 後,LAST_INSERT_ID() 回傳的是修改前的自增值。應用層需自行按觸發器邏輯反推真實主鍵值。

建議

  • 單機/主從架構:優先用 BIGINT AUTO_INCREMENT。
  • 多主/分散式寫入:考慮 UUID(可有序化如 COMB/ULID)或 AUTO_INCREMENT + 節點偏移,但需接受空間/效能代價。
  • 不要為了「避免熱點」而過早優化採用多序列或 UUID,實測證實單序列在高併發下同樣優秀。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved