對 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);

CRC32() 回傳無號整數,碰撞機率極低(約 1/42 億),適合作為等值查詢的過濾索引。WHERE crcmsg = CRC32('www.baidu.com') AND msg = 'www.baidu.com' 確保零誤判。key_len 越小 → 索引頁面容納更多條目 → B+ 樹高度更低 → IO 次數更少。延伸:MySQL 8.0 可使用函數索引INDEX ((CRC32(msg)))免去手動維護欄位;InnoDB 主鍵為聚簇索引,二級索引葉節點儲存主鍵值,key_len優化效果更明顯。