在Mysql數據庫平常運維過程當中,在表上建立索引是很常見的事情,但是一直沒有思考過,單列索引到底能有多長呢。若是varchar類型的字段過長,建立單列索引會不會失敗呢,下面就來一塊兒探索一下吧。mysql
查閱官方文檔,發如今MySQL5.6 版本後引入了參數 innodb_large_prefix,開啓狀況下,Innodb表的行記錄格式是Dynamic或Compressed的前提下,能讓單列索引的長度達到3072個字節長度,若是不開啓這個參數,那麼單列索引的長度就不能超過767個字節長度。sql
測試環境介紹
測試環境的是MySQL5.7版本,默認字符集是utf8。數據庫
查看innodb_large_prefix參數運維
innodb_large_prefix參數在mysql5.7版本,默認是開啓的。mysql> show variables like 'innodb_large%'; +---------------------+-------+ | Variable_name | Value | +---------------------+-------+ | innodb_large_prefix | ON | +---------------------+-------+ 1 row in set (0.02 sec)
查看測試表的默認記錄格式
在mysql5.7版本中,Innodb表的行記錄格式爲Dynamic的。ide
mysql> show variables like 'innodb_default_row_format'; +---------------------------+---------+ | Variable_name | Value | +---------------------------+---------+ | innodb_default_row_format | dynamic | +---------------------------+---------+ 1 row in set (0.01 sec)
模擬測試
建立測試表和索引測試
mysql> create table t_test2 (id int not null,name varchar(1024) not null default '',primary key(id)); Query OK, 0 rows affected (0.02 sec) mysql> alter table t_test2 add index idx_t_test2_name(name); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> create table t_test3 (id int not null,name varchar(1025) not null default '',primary key(id)); Query OK, 0 rows affected (0.03 sec) mysql> alter table t_test3 add index idx_t_test3_name(name); ERROR 1071 (42000): Specified key was too long; max key length is 3072
bytes從測試結果上能夠看出,當varchar的字段長度超過1024以後,建立單列索引就會報錯,爲何呢,由於數據庫的字符集是utf8,一個字符長度佔用3個字節,那麼單列索引的長度是3072,轉換成字符 3072 / 3=1024,這樣建表時,若是字段長度超過1024,建立索引就會失敗。
關閉innodb_large_prefix參數測試code
關閉innodb_large_prefix參數orm
mysql> set global innodb_large_prefix=off; Query OK, 0 rows affected, 1 warning (0.11 sec) mysql> show variables like 'innodb_large_prefix'; +---------------------+-------+ | Variable_name | Value | +---------------------+-------+ | innodb_large_prefix | OFF | +---------------------+-------+ 1 row in set (0.00 sec) mysql> create table t_test4 (id int not null,name varchar(255) not null default '',primary key(id)); Query OK, 0 rows affected (0.02 sec) mysql> alter table t_test4 add index idx_t_test4_name(name); Query OK, 0 rows affected (0.35 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> create table t_test5 (id int not null,name varchar(256) not null default '',primary key(id)); Query OK, 0 rows affected (0.01 sec) mysql> alter table t_test5 add index idx_t_test5_name(name); ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
能夠看到此時,字段長度超過255,建立單列索引就會報錯。索引
但是在生產,誰會在長度超過1024的列上建立索引呢,這不是有病麼,因此建議將innodb_large_prefix參數關閉,避免在長字段上建立索引。ci