当前位置: 代码网 > it编程>数据库>Mysql > mysql5.6建立索引报错1709问题及解决

mysql5.6建立索引报错1709问题及解决

2024年05月15日 Mysql 我要评论
现象描述在给varchar字段建立索引时,报错如下:[root@localhost:(test) 13:53:27]> create index b_name_idx using btree o

现象描述

在给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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com