Mysql
varchar(255) 欄位還是雜湊欄位?
考慮具有數百萬條記錄的表和表模式:
CREATE TABLE `foos` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `foo` varchar(255) COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `foo_UNIQUE` (`foo`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
每秒執行大量此查詢
SELECT 1 FROM foos WHERE foo=?
如果沒有找到記錄,將執行此查詢:
INSERT INTO foos(foo) VALUES(?)
平均長度
foo
小於20。為了優化性能,考慮使用散列欄位添加md5(foo)
和刪除唯一鍵。ALTER TABLE foos DROP INDEX foo_UNIQUE; ALTER TABLE foos ADD INDEX `foo_IDX` (`hash`);
查詢將更改為:
SELECT 1 FROM foos WHERE hash=?
如果沒有找到記錄,將執行此查詢:
INSERT INTO foos(foo, hash) VALUES(?, ?)
問題是:查詢是否會執行
SELECT
得更快,因為平均長度foo
小於 20 但散列欄位長度始終為 32?
$$ In this answer, I assume using MD5 as hashing function $$
答案是肯定的。添加“雜湊”欄位並查詢它會執行得更快。
詳細說明: 索引
varchar(255)
欄位時,雖然平均長度為20 char,但索引中的每個條目將保存為全長,即255 char。除此之外,如果您使用utf8
,則條目長度將為 255*3 字節(加上 PK 長度)。添加雜湊欄位時,請確保它具有固定長度(在 MD5 的情況下為 32),並且 CHARSET 是拉丁文,即每個字元 1 個字節。在這種情況下,索引中的條目將是 32 字節(加上 PK 長度)
如果要保證
foo
欄位的唯一性,建議在雜湊欄位上添加唯一索引(相對於正常索引)