现象描述
在给varchar字段建立索引时,报错如下:
[root@localhost:(test) 13:53:27]> create index b_name_idx using btree on test.b(name);error 1709 (hy000): index column size too large. the maximum column size is 767 bytes.
查看表结构:
create table `b` ( `name` varchar(250) default null, `standardized_name` varchar(250) default null, `is_reagent` int(11) not null default '0', `is_solvent` int(11) not null default '0', `is_catalyst` int(11) not null default '0', `is_ligand` int(11) not null default '0', `to_delete` int(11) default '0', ) engine=innodb default charset=utf8mb4;
原因分析
索引字段的长度大于767,或者说,使用到的字段的长度和大于767则报错。
mysql 5.6 中的innodb_large_prefix
默认是关闭的。
在mysql中,innodb_large_prefix
参数是一个 innodb 存储引擎的配置选项。
这个参数控制是否允许使用超过767字节(或255个字符)的索引前缀。
默认情况下,在mysql 5.6及以前版本中,innodb存储引擎对索引列的最大长度限制为767字节。
对于变长数据类型如varchar,这个限制包括了字符集的每个字符可能占用的字节数,而不是仅仅指字符数。
例如,如果你使用的是utf-8字符集,每个字符可能占用1到4个字节,所以一个varchar(255)字段的实际最大长度可能会远小于255个字符。
当 innodb_large_prefix
设置为 on
时,innodb 支持更大的索引前缀长度,最大可以达到3072字节。
这意味着你可以创建更长的索引,特别是对于包含大量变长数据类型的列。
这对于处理大数据表和需要更复杂查询的情况非常有用。
要启用 innodb_large_prefix
,你可以在 mysql 配置文件(如 my.cnf 或 my.ini)中添加以下行,并重启 mysql 服务以应用更改:
[mysqld] innodb_large_prefix = on
或者,你可以在运行时通过设置全局变量来开启它:
set global innodb_large_prefix = on;
请注意,为了使 innodb_large_prefix
生效,还需要同时满足以下条件:
- 数据库文件格式必须是 barracuda。
- 表格式必须是 dynamic 或 compressed。
- 对于 row_format=compact 的表,仍然有 767 字节的索引前缀限制。
有关这些条件的详细信息,请参阅 mysql 文档。
问题处理
set global innodb_large_prefix=on; show variables like 'innodb_large_prefix'; alter table b row_format=dynamic; set global innodb_file_format=barracuda;
再次加索引:
[root@localhost:(test) 13:54:18]> create index b_name_idx using btree on test.b(name); query ok, 0 rows affected (0.06 sec) records: 0 duplicates: 0 warnings: 0
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论