mysql索引过长Specialed key was too long问题记录
在创建要给表的时候遇到一个有意思的问题,提示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问题记录相关推荐
- mysql 索引过长1071-max key length is 767 byte
原因 数据库表采用utf8编码,其中varchar(255)的column进行了唯一键索引 而mysql默认情况下单个列的索引不能超过767位(不同版本可能存在差异) 于是utf8字符编码下,255* ...
- mysql 索引太长_修改Mysql索引长度限制
mysql 索引过长1071-max key length is 767 byte 问题 create table: Specified key was too long; max key lengt ...
- mysql 索引太长,Mysql索引过长问题解析
近期遇到两次mysql建表时,提示索引过长错误信息的问题. 根据错误信息提示,检查建表语句,发现对应的索引字段为VARCHAR(256).与提示的767bytes长度相差较大.由此引出Mysql(大多 ...
- 索引过长 max key length is 767 bytes
背景 开发人员今天找我在stg环境建立索引的时候提示如下: 从字面意思来看,这句话的意思是: 索引超出了限制的长度767字节 分析 show create table t_xx_company; 结果 ...
- mysql设置索引长度_修改Mysql索引长度限制
mysql 索引过长1071-max key length is 767 byte 问题 create table: Specified key was too long; max key lengt ...
- mysql 索引长度限制_修改Mysql索引长度限制
mysql 索引过长1071-max key length is 767 byte 问题 create table: Specified key was too long; max key lengt ...
- mysql json匹配key为数值_干货篇:一篇文章让你——《深入解析MySQL索引原理》
概述 最近一段时间重新深入研究了一遍MySQL的内容,今天主要分享分析MySQL索引原理,后续会输出一些关于MySQL方面的干货,希望各位小伙伴喜欢. 一.什么是索引.为什么要建立索引? 关于索引的理 ...
- 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 ...
- mysql索引空间太大_MySQL优化索引
1. MySQL如何使用索引 索引用于快速查找具有特定列值的行.如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行.表越大,花费越多.如果表中有相关列的索引,MySQL可以快速确 ...
最新文章
- USEARCH — 最简单易学的扩增子分析流程(中国总代理)
- JSP显示错误信息中四个范围来保存变量
- 【Android 安装包优化】WebP 应用 ( libwebp 源码下载 | Android.mk 和 Application.mk 构建脚本修改 | libwebp 函数库编译 )
- LESSON 9.5 随机森林在巨量数据上的增量学习
- HALCON示例程序board.hdev检测电路板焊锡有无程序剖析
- JRebel 启动报错 could not be processed by xxx
- html div英文自动换行,div 实现长英文字母自动换行CSS
- 程序员降薪求职到底该不该?
- Ubuntu安装Atom编辑器
- 《疯狂的程序员》经典语录
- Sharepoint Solution Gallery Active Solution时激活按钮灰色不可用的解决方法
- 二元一次方程有唯一解的条件_线性方程组在什么时候有唯一解/无穷个解/无解?...
- 三维GIS软件十九重唱
- 101平衡模式 DIR的理解
- 浪漫七夕—很幸运一路有你
- android动态mac地址,android 设备唯一码的获取,Cpu号,Mac地址
- 远程桌面端口映射如何设置
- 修改Docker默认的数据目录
- 关于ASCII()函数
- GDT——陶瓷气体放电管的连接方式-优恩讲解
热门文章
- python是否空字典_Python-检查字典是否为空
- 面向协议与面向对象的区别
- 【x86架构】SMM
- 得吃货者得天下,美食内容IP如何征服大众的胃与心?
- 凯文.柯恩《真爱无尽精选辑》
- 医学成像技术简介(CT,MRI等)及相关论坛、技术应用链接
- 数据库实战20_获取所有员工的emp_no、部门编号dept_no以及对应的bonus类型btype和received,没有分配奖金的员工不显示对应的bonus类型btype和received
- 《重新定义公司:谷歌是如何运营的》读书笔记
- PDF文件的身份证号码
- SAP中采购计划协议中交货容差测试