mysql索引長度

2022-08-31 18:39:13 字數 1456 閱讀 6083

大家應該知道innodb單列索引長度不能超過767bytes,聯合索引還有乙個限制是長度不能超過3072。

mysql> createtable`tb` (  

->   `a` varchar(255) defaultnull,  

->   `b` varchar(255) defaultnull,  

->   `c` varchar(255) defaultnull,  

->   `d` varchar(255) defaultnull,  

->   `e` varchar(255) defaultnull,  

->   key`a` (`a`,`b`,`c`,`d`,`e`)  

-> ) engine=innodb defaultcharset=utf8;  

error 1071 (42000): specified keywas too long; maxkeylength is3072 bytes 

可以看到,由於每個字段占用255*3, 因此這個索引的大小是3825>3072,報錯。

為什麼3072

我們知道innodb乙個page的預設大小是16k。由於是btree組織,要求葉子節點上乙個page至少要包含兩條記錄(否則就退化鍊錶了)。

所以乙個記錄最多不能超過8k。

又由於innodb的聚簇索引結構,乙個二級索引要包含主鍵索引,因此每個單個索引不能超過4k (極端情況,pk和某個二級索引都達到這個限制)。

由於需要預留和輔助空間,扣掉後不能超過3500,取個「整數」就是(1024*3)。 

單列索引限制

上面有提到單列索引限制767,起因是256×3-1。這個3是字元最大占用空間(utf8)。但是在5.5以後,開始支援4個位元組的uutf8。255×4>767, 於是增加了乙個引數叫做 innodb_large_prefix。

這個引數預設值是off。當改為on時,允許列索引最大達到3072。

可以看到預設行為是建表成功,報乙個warning,並且將長度階段為255。

注意要生效需要加row_format=compressed或者dynamic  。

如果確實需要在單個很大的列上建立索引,或者需要在多個很大的列上建立聯合索引,而又超過了索引的長度限制,解決辦法是在建索引時限制索引prefix的大小:

這樣,在建立索引時就會限制使用的每個列的最大長度。如上的例子中,在建立聯合索引時,最多使用列flow_exec_id中前100個字元建立索引,最多使用another_column中前

50個字元建立索引。這樣子,就可以避免索引長度過大的問題。

最後,我想說一句。我們在設計資料庫時,最好不要在乙個可能包含很長字串的列上建立索引,尤其是當這個列中的字串都很長時。如果在這類列上建立了索引,那麼在建立索引時以及根據索引查詢時,都會浪費很多時間在計算和儲存上。有經驗的設計人員應該不會這樣設計資料庫。

mysql 索引長度

specified key was too long max key length is 767 bytes mysql在innodb引擎下的主鍵索引或者unique索引的最大長度為767bytes,在myisam下是1000bytes。當時我在建立unique索引的時候使用了兩個varchar 2...

Mysql 索引長度限制

在設定 utf8mb4 欄位的字元長度時,可能會丟擲乙個異常 specified key was too long max key length is 1000 bytes 也就是在給表的索引字段新增字元長度時,超過了最大索引長度 1000 位元組。關於索引長度的限制,最主要的因素就是儲存引擎和字符...

MySQL索引長度限制

textfield是不支援建立索引的 mysql對索引字段長度有限制 innodb引擎的每個索引列長度限制為767位元組 bytes 所有組成索引列的長度和不能大於3072位元組 myisam引擎的每個索引列長度限制為1000位元組,所有組成索引列的長度和不能大於1000位元組 varchar的最大...