#1071 – Specified key was too long; max key length is 1000 bytes

為DB加index會運到的問題為了要加速資料庫的運作,很多設計師都會在資料庫加索引。我自己會使用的資料庫是mysql,mysql也有支援index這個基本的功能,當然最近我為了測試一些東西,也加了index進資料表,結果就出現了「#1071 – Specified key was too long; max key length is 1000 bytes」錯誤,後來查了一下才知道是怎麼回事,寫下來記錄一下,避免日後忘記。

明明3個欄位怎麼算都沒有1000byte,出了這個訊息,實也摸不著頭緒,原來待誌不是憨人(蝸牛)所想的,聽我慢慢道來。

其實也沒有這麼難,只要知道編碼的方式,再算一下就知道了。
不同的編碼的字元長度是不一樣的,例舉了常會用到的latin1,utf8,gbk,big5
latin1 = 1 byte = 1 character
uft8 = 3 byte = 1 character
gbk = 2 byte = 1 character
big5= 2 byte = 1 character
在UTF8的編碼下,1個字元是3個byte,而使用latin1的編碼,1個英文字就是1個字元,就是1Byte。

我想要做index的欄位分別有3個,預設的編碼是UTF8,第1個(int:6),第2個(varchar:80),第3個(varchar:256)。

1組index會多大呢?
(6+80+256)*3=1026 byte,就超過了1000byte的長度。修改了其中第二個欄位的大小,調小到varchar:20(80->20),變成864byte=(6+20+256)*3,索引就可以成功建立。

有時不能只考慮資料結構,考慮到速度和程式設計的複雜度,會進行反正規化,反正規化,也是架構師會的技巧之一。反正規化和索引有沒有關係呢?其實是有的,越多階的正規化,資料表的欄位數會變少,但是資料表的個數會變多,多表查詢時,index就會派上用場了。

索引有建立,當query時,用到2個以上的欄位,就會預先使用索引來加快速度,用空間換取時間,let’s speed up。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *