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

 更新时间:2024年03月29日 09:30:36   作者:ReadVersion  
这篇文章主要介绍了mysql5.6建立索引报错1709问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

现象描述

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持程序员之家。

相关文章

  • MYSQL中varchar和TEXT的相关问题详析

    MYSQL中varchar和TEXT的相关问题详析

    varchar 和 text 是 MySQL 字符存储争议比较多的领域,下面这篇文章主要给大家介绍了关于MYSQL中varchar和TEXT,文中介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • 一文详解MySQL不同隔离级别都使用什么锁

    一文详解MySQL不同隔离级别都使用什么锁

    这篇文章主要为大家详细介绍了在MySQL中不同隔离级别都会使用什么锁,文中的示例代码讲解详细,对我们学习MySQL有一定帮助,需要的可以参考一下
    2022-09-09
  • mysql 5.7.19 二进制最新安装

    mysql 5.7.19 二进制最新安装

    这篇文章主要介绍了mysql 5.7.19 二进制最新安装的相关资料,需要的朋友可以参考下
    2017-10-10
  • delete、truncate、drop的区别以及该如何选择

    delete、truncate、drop的区别以及该如何选择

    这篇文章主要给大家介绍了关于delete、truncate、drop的区别以及该如何选择的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • MySQL数据库高可用HA实现小结

    MySQL数据库高可用HA实现小结

    MySQL数据库是目前开源应用最大的关系型数据库,有海量的应用将数据存储在MySQL数据库中,这篇文章主要介绍了MySQL数据库高可用HA实现,需要的朋友可以参考下
    2022-01-01
  • mysql 触发器实现两个表的数据同步

    mysql 触发器实现两个表的数据同步

    本文将介绍mysql 触发器实现两个表的数据同步,需要的朋友可以参考
    2012-11-11
  • MySQL系列之七 MySQL存储引擎

    MySQL系列之七 MySQL存储引擎

    存储引擎是数据库的核心,对于mysql来说,存储引擎是以插件的形式运行的。虽然mysql支持种类繁多的存储引擎,但是常用的就那么几种。这篇文章主要给大家介绍MySQL存储引擎的相关知识,一起看看吧
    2021-07-07
  • mysql中查询字段为null的数据navicat问题

    mysql中查询字段为null的数据navicat问题

    这篇文章主要介绍了mysql中查询字段为null的数据navicat问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Linux下MySql 1036 错误码解决(1036: Table ''xxxx'' is read only)

    Linux下MySql 1036 错误码解决(1036: Table ''xxxx'' is read only)

    我们在进行数据库搬家的时候,经常会遇到(1036: Table 'xxxx' is read only)的问题,字面意思很明确,就是数据库只有读权限,无写权限,那么我们来分享下我的处理办法
    2014-07-07
  • mysql启动服务报1058错误的解决方法

    mysql启动服务报1058错误的解决方法

    这篇文章主要介绍了mysql启动服务报1058错误的解决方法,需要的朋友可以参考下
    2014-03-03

最新评论

?


http://www.vxiaotou.com