Mysql5.7的varchar類型字段建索引居然失敗

在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

相關文章
相關標籤/搜索