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

2021-08-21 01:14:28 字數 2226 閱讀 5692

組合索引長度之和大於 767 bytes並無影響,當有某個字段定義長度大於 767 bytes(1000*3)時,僅產生告警,但不影響建立,超長欄位會取前 255 字元作為字首索引,並且組合索引中欄位出現的順序並無關係。

為什麼3072

innodb乙個page的預設大小是 16 k。由於是btree組織,要求葉子節點上乙個page至少包含兩條記錄(否則就退化鍊錶了)。所以乙個記錄最多不能超過 8 k。又由於innodb的聚簇索引結構,乙個二級索引要包含主鍵索引,因此每個單個索引不能超過 4 k(極端情況,pk和某個二級索引都達到這個限制)。由於需要預留和輔助空間,扣掉後不能超過 3500 ,取個「整數」就是(1024*3)。

單列索引限制

預設情況下,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 或者 dynamic

innodb的索引會限制單獨key的最大長度為 767 位元組,超過這個長度必須建立小於等於 767 位元組的字首索引。 此外,blob和text型別的列只能建立字首索引。 字首索引能提高索引建立速度和檢索速度,但是下面情況是無法使用字首索引的:

索引覆蓋掃瞄

通過索引的排序(order by, group by)

修改索引限制長度需要在my.ini配置檔案中新增以下內容,並重啟:

#修改單列索引位元組長度為767的限制,單列索引的長度變為3072

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=1

在建立表的時候需要指定表的行格式為dynamic  row_format=dynamic;

MySQL InnoDB引擎索引長度受限怎麼辦?

大家應該知道innodb單列索引長度不能超過767bytes,聯合索引還有乙個限制是長度不能超過3072。mysql create table tb a varchar 255 default null b varchar 255 default null c varchar 255 default...

Mysql (InnoDB引擎)聚集索引和輔助索引

innodb儲存引擎表是索引組織表,即按照主鍵的順序儲存資料。聚集索引 clustered index 就是按照每張表的主鍵構造一棵b 樹,樹中的葉子節點存放著表中的行記錄資料,因此,也將聚集索引的葉子節點稱為資料頁 非葉子節點中存放著僅僅是鍵值和指向葉子節點的偏移量。每個葉子節點 資料頁 都通過乙...

MySQL InnoDB引擎B 樹索引簡單整理說明

本文出處 mysql中的innodb引擎表索引型別有一下幾種 以下所說的索引,沒有特殊說明,均指innodb引擎表索引。0 secondary index,二級索引,1 clustered index,聚集索引 2 unique index,唯一索引 3 primary index,主鍵索引 32 ...