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

MySQL 優化實戰:CRC32 Hash 索引替代長字串索引,Key_Len 縮減 90% 提升查詢速度

     編輯:MySQL 資料庫相關知識

對 VARCHAR(20) 長字串欄位建立前綴索引 msg(5) 仍佔用較大 key_len。本文實測新增 INT 欄位儲存 CRC32(msg) 雜湊值並建立索引,key_len 從 17 降為 5,查詢效能顯著提升。

實測步驟

CREATE TABLE t1 (
  id INT AUTO_INCREMENT PRIMARY KEY,
  msg VARCHAR(20) NOT NULL DEFAULT '',
  crcmsg INT NOT NULL DEFAULT 0
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO t1 (msg) VALUES ('www.baidu.com'), ('www.sina.com');

-- 原字串前綴索引
ALTER TABLE t1 ADD INDEX idx_msg (msg(5));

-- 計算 CRC32 並建立整數索引
UPDATE t1 SET crcmsg = CRC32(msg);
ALTER TABLE t1 ADD INDEX idx_crcmsg (crcmsg);

初始資料 字串前綴索引 key_len=17 EXPLAIN 對比:idx_crcmsg key_len=5 最終表結構

原理與注意事項

  • CRC32() 回傳無號整數,碰撞機率極低(約 1/42 億),適合作為等值查詢的過濾索引。
  • 查詢時需同時比對原字串:WHERE crcmsg = CRC32('www.baidu.com') AND msg = 'www.baidu.com' 確保零誤判。
  • key_len 越小 → 索引頁面容納更多條目 → B+ 樹高度更低 → IO 次數更少。
  • 適用場景:URL、MD5、SHA1、Email 等固定長度、高基數字串等值查詢。
延伸:MySQL 8.0 可使用函數索引 INDEX ((CRC32(msg))) 免去手動維護欄位;InnoDB 主鍵為聚簇索引,二級索引葉節點儲存主鍵值,key_len 優化效果更明顯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved