在创建要给表的时候遇到一个有意思的问题,提示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索引过长Specialed key was too long问题记录相关推荐

  1. mysql 索引过长1071-max key length is 767 byte

    原因 数据库表采用utf8编码,其中varchar(255)的column进行了唯一键索引 而mysql默认情况下单个列的索引不能超过767位(不同版本可能存在差异) 于是utf8字符编码下,255* ...

  2. mysql 索引太长_修改Mysql索引长度限制

    mysql 索引过长1071-max key length is 767 byte 问题 create table: Specified key was too long; max key lengt ...

  3. mysql 索引太长,Mysql索引过长问题解析

    近期遇到两次mysql建表时,提示索引过长错误信息的问题. 根据错误信息提示,检查建表语句,发现对应的索引字段为VARCHAR(256).与提示的767bytes长度相差较大.由此引出Mysql(大多 ...

  4. 索引过长 max key length is 767 bytes

    背景 开发人员今天找我在stg环境建立索引的时候提示如下: 从字面意思来看,这句话的意思是: 索引超出了限制的长度767字节 分析 show create table t_xx_company; 结果 ...

  5. mysql设置索引长度_修改Mysql索引长度限制

    mysql 索引过长1071-max key length is 767 byte 问题 create table: Specified key was too long; max key lengt ...

  6. mysql 索引长度限制_修改Mysql索引长度限制

    mysql 索引过长1071-max key length is 767 byte 问题 create table: Specified key was too long; max key lengt ...

  7. mysql json匹配key为数值_干货篇:一篇文章让你——《深入解析MySQL索引原理》

    概述 最近一段时间重新深入研究了一遍MySQL的内容,今天主要分享分析MySQL索引原理,后续会输出一些关于MySQL方面的干货,希望各位小伙伴喜欢. 一.什么是索引.为什么要建立索引? 关于索引的理 ...

  8. mysql索引长度超过767bytes问题解决。Specified key was too long; max key length is 767 bytes

    mysql索引长度超过767bytes问题解决.   错误信息: Specified key was too long; max key length is 767 bytes MySQL的InnoD ...

  9. mysql索引空间太大_MySQL优化索引

    1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行.如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行.表越大,花费越多.如果表中有相关列的索引,MySQL可以快速确 ...

最新文章

  1. USEARCH — 最简单易学的扩增子分析流程(中国总代理)
  2. JSP显示错误信息中四个范围来保存变量
  3. 【Android 安装包优化】WebP 应用 ( libwebp 源码下载 | Android.mk 和 Application.mk 构建脚本修改 | libwebp 函数库编译 )
  4. LESSON 9.5 随机森林在巨量数据上的增量学习
  5. HALCON示例程序board.hdev检测电路板焊锡有无程序剖析
  6. JRebel 启动报错 could not be processed by xxx
  7. html div英文自动换行,div 实现长英文字母自动换行CSS
  8. 程序员降薪求职到底该不该?
  9. Ubuntu安装Atom编辑器
  10. 《疯狂的程序员》经典语录
  11. Sharepoint Solution Gallery Active Solution时激活按钮灰色不可用的解决方法
  12. 二元一次方程有唯一解的条件_线性方程组在什么时候有唯一解/无穷个解/无解?...
  13. 三维GIS软件十九重唱
  14. 101平衡模式 DIR的理解
  15. 浪漫七夕—很幸运一路有你
  16. android动态mac地址,android 设备唯一码的获取,Cpu号,Mac地址
  17. 远程桌面端口映射如何设置
  18. 修改Docker默认的数据目录
  19. 关于ASCII()函数
  20. GDT——陶瓷气体放电管的连接方式-优恩讲解

热门文章

  1. python是否空字典_Python-检查字典是否为空
  2. 面向协议与面向对象的区别
  3. 【x86架构】SMM
  4. 得吃货者得天下,美食内容IP如何征服大众的胃与心?
  5. 凯文.柯恩《真爱无尽精选辑》
  6. 医学成像技术简介(CT,MRI等)及相关论坛、技术应用链接
  7. 数据库实战20_获取所有员工的emp_no、部门编号dept_no以及对应的bonus类型btype和received,没有分配奖金的员工不显示对应的bonus类型btype和received
  8. 《重新定义公司:谷歌是如何运营的》读书笔记
  9. PDF文件的身份证号码
  10. SAP中采购计划协议中交货容差测试