我的编程空间,编程开发者的网络收藏夹
学习永远不晚

mysql索引过长以及专用密匙太长的解决方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

mysql索引过长以及专用密匙太长的解决方法

今天就跟大家聊聊有关mysql索引过长以及专用密匙太长的解决方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

在创建要给表的时候遇到一个有意思的问题,提示Specified key was too long; max key length is 767 bytes,从描述上来看,是Key太长,超过了指定的 767字节限制

下面是产生问题的表结构

CREATE TABLE `test_table` (  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,  `name` varchar(1000) NOT NULL DEFAULT '',  `link` varchar(1000) NOT NULL DEFAULT '',  PRIMARY KEY (`id`),  KEY `name` (`name`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

我们可以看到,对于name,我们设置长度为1000可变字符,因为采用utf8mb4编码, 所以它的大小就变成了 1000 * 4 > 767
所以再不修改其他配置的前提下,varchar的长度大小应该是 767 / 4 = 191

有兴趣的同学可以测试下,分别指定name大小为191, 192时,是不是前面的可以创建表成功,后面的创建表失败,并提示错误Specified key was too long; max key length is 767 bytes

解决办法一

  • 使用innodb引擎

  • 启用innodb_large_prefix选项,修改约束扩展至3072字节

  • 重新创建数据库

my.cnf配置

set global innodb_large_prefix=on;set global innodb_file_per_table=on;set global innodb_file_format=BARRACUDA;set global innodb_file_format_max=BARRACUDA;

上面这个3072字节的得出原因如下

我们知道InnoDB一个page的默认大小是16k。由于是Btree组织,要求叶子节点上一个page至少要包含两条记录(否则就退化链表了)。
所以一个记录最多不能超过8k。又由于InnoDB的聚簇索引结构,一个二级索引要包含主键索引,因此每个单个索引不能超过4k (极端情况,pk和某个二级索引都达到这个限制)。
由于需要预留和辅助空间,扣掉后不能超过3500,取个“整数”就是(1024*3)。

解决办法二

在创建表的时候,加上 row_format=DYNAMIC

CREATE TABLE `test_table` (  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,  `name` varchar(255) NOT NULL DEFAULT '',  `link` varchar(255) NOT NULL DEFAULT '',  PRIMARY KEY (`id`),  KEY `name` (`name`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 row_format=DYNAMIC;

这个参数的作用如下

MySQL 索引只支持767个字节,utf8mb4 每个字符占用4个字节,所以索引最大长度只能为191个字符,即varchar(191),若想要使用更大的字段,mysql需要设置成支持数据压缩,并且修改表属性 row_format ={DYNAMIC|COMPRESSED}

看完上述内容,你们对mysql索引过长以及专用密匙太长的解决方法有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

mysql索引过长以及专用密匙太长的解决方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql索引过长以及专用密匙太长的解决方法

今天就跟大家聊聊有关mysql索引过长以及专用密匙太长的解决方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在创建要给表的时候遇到一个有意思的问题,提示Specified key
2023-06-25

Linux中MySQL跳过密码验证以及Bug的解决方法(图文)

目录1.问题所示2. 基本知识3. 解决方法3.1 跳过验证Bug3.2 设定初始密码1.问题所示发现密码验证错误,遗失密码2. 基本知识停止mysql服务:sudo systemctl stop mysql以跳过权限表模式启动MySQ
Linux中MySQL跳过密码验证以及Bug的解决方法(图文)
2024-09-10

编程热搜

目录