為了要加速資料庫的運作,很多設計師都會在資料庫加索引。我自己會使用的資料庫是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。
隨機文章
- youtube sever crash. Youtube無法正常運作 (2013-11-19)
- XenServer 線上備份 online backup (2016-08-14)
- 鼎新 WORKFLOW ERP 密碼過期通知機制問題? (2019-04-20)
- 捕夢網的資料備份還原方式 (2015-01-22)
- 20170408 有感廢文 (2017-04-08)