Mysql

varchar(255) 欄位還是雜湊欄位?

  • January 14, 2019

考慮具有數百萬條記錄的表和表模式:

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欄位的唯一性,建議在雜湊欄位上添加唯一索引(相對於正常索引)

引用自:https://dba.stackexchange.com/questions/199924