Mysql 索引長度限制

2021-10-08 11:52:58 字數 2927 閱讀 4827

在設定 utf8mb4 欄位的字元長度時,可能會丟擲乙個異常:"specified key was too long; max key length is 1000 bytes"。也就是在給表的索引字段新增字元長度時,超過了最大索引長度 1000 位元組。

關於索引長度的限制,最主要的因素就是儲存引擎和字符集。

字符集的影響在於,不同的字符集,單個字元包含的最大位元組數有所不同。比如 utf8 字符集,乙個字元最多包含 3 個位元組。而 utf8mb4 乙個字元最多包含 4 個位元組。

1) mysql 版本 <=5.7.6

如果是單字段索引,則字段長度不應超過 767 位元組。

如果是聯合索引,則每個字段長度都不應超過 767 位元組,且所有字段長度合計不應超過 3072 位元組。

這種情況下,常見字符集和引擎組合後的字元長度限制如下:

innodb

最大位元組數

單字段索引最大字元數

聯合索引合計最大字元數

lantin1

1767

3072

gbk2

3831536

utf8

3255

1024

utf8mb4

4191

7682) mysql 版本 >=5.7.7

在該版本情況下,由於 innodb 引擎的 innodb_large_prefix 等選項預設值改變,單字段索引長度限制增大。

如果是單字段索引,則字段長度不應超過 3072 位元組。

如果是聯合索引,則每個字段長度都不應超過 3072 位元組,且所有字段長度合計不應超過 3072 位元組。

這種情況下,常見字符集和引擎組合後的字元長度限制如下:

innodb

最大位元組數

單字段索引最大字元數

聯合索引合計最大字元數

lantin1

13072

3072

gbk2

1536

1536

utf8

31024

1024

utf8mb4

4768

768如果 mysql 版本 <=5.5.4 則其預設儲存引擎為 myisan。

如果是單字段索引,則字段長度不應超過 1000 位元組。

如果是聯合索引,則每個字段長度都不應超過 1000 位元組,且所有字段長度合計不應超過 1000 位元組。

這種情況下,常見字符集和引擎組合後的字元長度限制如下:

myisam

最大位元組數

單字段索引最大字元數

多欄位索引合計最大字元數

lantin1

11000

1000

gbk2

500500

utf8

3333

333utf8mb4

4250

250(1)修改儲存引擎

(2)修改字符集

(3)修改索引欄位的字元長度

在 mysql 版本 <=5.7.6 且字符集為 utf8mb4 的情況下,設定需要新增索引的字段長度為 191。

(4)在 mysql<=5.7.6 的情況,修改 innodb 選項,將單字段索引長度限制由 767 位元組(bytes)提高到 3072 位元組。

先檢視當前預設選項值:

show variables like 'innodb_large_prefix';

show variables like 'innodb_file_per_table';

show variables like 'innodb_file_format';

確認選項值是否是:

innodb_large_prefix=on

innodb_file_per_table=on

innodb_file_format=barracuda

如果不是,進行相應的修改:

set global innodb_large_prefix = 1;

set global innodb_file_per_table = 1;

set global innodb_file_format = barracuda;

上面兩項的值設定為 1 而不是 on,是因為在 mysql5.6 之前,布林值的變數還無法識別 on 或者 off,只能是數字 1 或者 0。

並且,在建立新錶時還要指定 row_format=dynamic 或 row_format=compressed。如:

create table `test` (

`a` varchar(767),

`b` varchar(1),

`c` varchar(200),

`d` varchar(168),

`e` varchar(5),

key `a_index` (`a`,`b`)

)engine=innodb default charset=utf8mb4 row_format=dynamic;

或修改當前表:

alter table [...], row_format=dynamic;

(5)在建立索引時限制欄位上的字首索引長度:

create table `test` (

`a` varchar(767),

`b` varchar(1),

`c` varchar(200),

`d` varchar(168),

`e` varchar(5),

key `a_index` (`a`(191),`b`)

)engine=innodb default charset=utf8mb4;

MySQL索引長度限制

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

突破索引長度限制

descript 利用checksum建立索引 use tempdb go drop table dbo.t create table dbo.t id int primary key identity 1,1 name nvarchar max 這裡我偷懶一下,自己注意在ide中,關閉,不要插入太...

mysql 索引長度

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