2013-04-30 78 views
6

我在閱讀MySQL 5.6只能索引varchar(或其他基於文本的類型)的索引the first 767 bytes。我的模式字符集是utf-8,因此每個字符最多可以存儲3個字節。由於767/3 = 255.66,這表示需要以255個字符索引的文本列的最大長度。經歷似乎證實了這一點,如下經歷:用InnoDB和UTF-8索引的vachar最大長度

create table gaga (
    val varchar(255), 
    index(val) 
) engine = InnoDB; 

但改變val的定義varchar(256)產生一個「錯誤代碼:1071指定的鍵過長,最大密鑰長度爲767個字節」。

在這一天的年齡,255個字符的限制似乎非常低,所以:這是正確的?如果是用MySQL索引更大文本的最佳方式是什麼? (我應該避免它嗎?存儲一個SHA?使用另一種索引?使用另一種數據庫字符編碼?)

回答

7

雖然限制看起來很荒謬,但如果您真的需要這樣一個長的varchar索引領域。即使使用767字節,索引大小也會非常快速地增長,對於大型表格(最有用的地方),很可能不適合內存。

從另一方面來看,唯一經常發生的情況是,至少在我的經驗中,我需要爲long varchar字段建立索引是一個獨特的約束。在所有這些情況下,來自varchar字段的某些組ID和MD5的組合索引就足夠了。唯一的問題是模仿不區分大小寫的整理(它考慮重音字符和不重音平等),儘管在所有情況下我都使用二進制整理,所以這不是問題。

UPD。索引long varchar的另一個常見情況是排序。對於這種情況,我通常定義一個單獨的索引分揀機字段,根據數據分佈,它是5-15個字符的前綴。對我而言,緊湊的索引比少有的不準確的訂購更可取。