mysql InnoDB引擎索引超過長度限制

組合索引長度之和大於 767 bytes並沒有影響,當有某個字段定義長度大於 767 bytes(1000*3)時,僅產生告警,但不影響建立,超長字段會取前 255 字符做爲前綴索引,而且組合索引中字段出現的順序並沒有關係。數據庫

爲何3072
InnoDB一個page的默認大小是 16 k。因爲是Btree組織,要求葉子節點上一個page至少包含兩條記錄(不然就退化鏈表了)。因此一個記錄最多不能超過 8 k。又因爲InnoDB的聚簇索引結構,一個二級索引要包含主鍵索引,所以每一個單個索引不能超過 4 k(極端狀況,pk和某個二級索引都達到這個限制)。因爲須要預留和輔助空間,扣掉後不能超過 3500 ,取個「整數」就是(1024*3)。ui

單列索引限制
默認狀況下,InnoDB 引擎單一字段索引的長度最大爲 767 字節,一樣的,前綴索引也有一樣的限制。當使用 UTF-8 字符集,每個字符使用 3 字節來存儲,767=256*3-1,在 TEXT 或者 VARCHAR 類型的字段上創建一個超過 255 字符數的前綴索引時就會遇到問題。至於爲何字符長度限制在 256 內,我猜是爲提升索引效率,應爲varchar類型須要額外的字節保留其長度信息,256 就將其限定在一個字節了。可是在5.5之後,開始支持4個字節的uutf8。255×4>767, 因而增長了一個參數叫作innodblargeprefix。這個參數默認值是OFF,當改成ON時,容許列索引最大達到 3072 字節。要求表的 row_format 須要使用 compressed 或者 dynamicorm

使用前綴索引帶來的風險:
INNODB的索引會限制單獨Key的最大長度爲 767 字節,超過這個長度必須創建小於等於 767 字節的前綴索引。 此外,BLOB和TEXT類型的列只能建立前綴索引。 前綴索引能提升索引創建速度和檢索速度,可是下面狀況是沒法使用前綴索引的:排序

索引覆蓋掃描
經過索引的排序(order by, group by)
修改索引限制長度須要在my.ini配置文件中添加如下內容,並重啓:索引

#修改單列索引字節長度爲767的限制,單列索引的長度變爲3072it

innodb_large_prefix=1
# Antelope(羚羊)是Built-in-InnoDB(MySQL內置的InnoDB)支持文件格式的代號,有兩種「數據表格式」(row_format):Redundant(冗餘)、Compact(緊湊)
#Barracuda(梭子魚)是InnoDB Plugin支持的文件格式,在原來的基礎上新增了兩種數據表格式的支持:Dynamic 和 Compressed
#innodb_file_format在配置文件中指定;row_format則在建立數據表時指定
#同時Barracude也支持 old redundant and compact row formats
innodb_file_format=BARRACUDA
#InnoDB Plugin引入的新的文件格式,也引入較爲完整的文件兼容性檢查,以防止誤操做非兼容的文件格式。兼容性檢查一共有三類:啓動數據庫時、建立數據表時、訪問數據表時。
#當數據庫啓動時候,參數innodb_file_format_check(>=5.1.38)會要求InnoDB在啓動時檢查當前數據表的格式。設置爲ON時,若是檢測到不支持的格式,那麼InnoDB會啓動失敗;設置爲OFF時,檢測到不支持的僅會給出警告,並不會致使啓動失敗。
#當建立數據表時,InnoDB會依據參數InnoDB_file_format進行檢查,若是建立的數據表格式高於InnoDB_file_format,則建立會失敗。
#當訪問某個數據表(table-access)時,InnoDB也會進行兼容性檢查。只要當前運行的InnoDB版本可以支持的格式,都可以被訪問,不管參數InnoDB_file_format的配置。
#把innodb_file_format_check設置爲OFF是很危險的。在InnoDB啓動後,通常須要作一些恢復工做,例如Double write buffer/Insert buffer中的數據處理(這依賴於innodb_fast_shutdown參數),試想若是成功啓動,可是某些表是不支持的格式,可是InnoDB仍然安裝舊版本作恢復,這可能會毀掉相關數據。
#因此,通常建議innodb_file_format_check設置爲ON。若是是OFF,關閉InnoDB的innodb_fast_shutdown參數務必設置成0
innodb_file_format_check=1innodb

在建立表的時候須要指定表的行格式爲dynamic  ROW_FORMAT=DYNAMIC;
---------------------

table

相關文章
相關標籤/搜索