mysql5.6建立索引报错1709

现象描述

在给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
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值