前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL中索引的长度的限制

MySQL中索引的长度的限制

作者头像
保持热爱奔赴山海
发布于 2019-09-17 06:04:30
发布于 2019-09-17 06:04:30
5.7K00
代码可运行
举报
文章被收录于专栏:数据库相关数据库相关
运行总次数:0
代码可运行

参考: http://dinglin.iteye.com/blog/1681332

单列索引的长度的限制

    (5.6里面默认不能超过767bytes,5.7不超过3072bytes):

    起因是256×3-1=767。这个3是字符最大占用空间(utf8)。但是在5.5以后,开始支持4个字节的uutf8。255×4>767, 于是增加了一个参数叫做 innodb_large_prefix

    # 256的由来: 只是因为char最大是255,所以以前的程序员以为一个长度为255的index就够用了,所以设置这个256.历史遗留问题。   --- by 阿里-丁奇

在MySQL5.6里默认 innodb_large_prefix=0 限制单列索引长度不能超过767bytes

   官网文档:https://dev.mysql.com/doc/refman/5.6/en/innodb-parameters.html#sysvar_innodb_large_prefix

注意:

在MySQL5.6里面,设置了innodb_large_prefix=ON、innodb_file_format=barracuda、innodb_file_per_table=ON ,且Innodb表的存储格式为 DYNAMIC 或 COMPRESSED,则前缀索引最多可包含3072个字节,前缀索引也同样适用。

 如下2例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
> create table t_DYNAMIC(
a int PRIMARY key not null AUTO_INCREMENT,
b varchar(3072)) 
character set=latin1 
ROW_FORMAT=DYNAMIC ;
> alter table t_DYNAMIC add index idx_b(b); -- 成功

> create table t_COMPACT(
a int PRIMARY key not null AUTO_INCREMENT,
b varchar(1000))
character set=latin1 ROW_FORMAT=COMPACT ;
> alter table t_COMPACT add index idx_b(b(800));   -- 失败,提示(1709, Index column size too large. The maximum column size is 767 bytes.)

在MySQL5.7里默认 innodb_large_prefix=1 解除了767bytes长度限制,但是单列索引长度最大还是不能超过3072bytes

联合索引的长度的限制 (不能超过3072bytes):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `tb` (
  `a` varchar(255) DEFAULT NULL,
  `b` varchar(255) DEFAULT NULL,
  `c` varchar(255) DEFAULT NULL,
  `d` varchar(255) DEFAULT NULL,
  `e` varchar(255) DEFAULT NULL,
  KEY `idx_a` (`a`,`b`,`c`,`d`,`e`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    上面这个建表语句会报错: ERROR 1071 (42000): Specified key was too long; max key length is 3072 bytes

    因为它创建的联合索引idx_a的长度为:255*3*5= 3825 bytes ,大于最大值 3072 bytes

 为什么3072,原因如下:   

我们知道InnoDB一个page的默认大小是16k。由于是Btree组织,要求叶子节点上一个page至少要包含两条记录(否则就退化链表了)。

所以一个记录最多不能超过8k。

又由于InnoDB的聚簇索引结构,一个二级索引要包含主键索引,因此每个单个索引不能超过4k (极端情况,primay-key和某个二级索引都达到这个限制)。

由于需要预留和辅助空间,扣掉后不能超过3500,取个“整数”就是 (1024bytes*3=3072bytes)。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/03/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
索引长度过长 ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
1.发现问题   今天在修改innodb表的某个列的长度时,报如下错误: [html] view plain copy print? alter table test2 modify colu
用户1214487
2018/04/18
5.2K0
mysql前缀索引 默认长度_如何确定前缀索引的长度?
Specified key ‘uniq_code’ was too long; max key length is 767 bytes.
全栈程序员站长
2022/08/31
3.8K0
小白学习MySQL - 索引键长度限制的问题
最近在工作中,碰到了个很诡异的问题,需求是在两个MySQL数据库为同一张表增加一个二级索引(单键值字段(x varchar(500))),表结构和加索引的语法,都是相同的,但是一个库执行成功了,一个执行失败了,提示错误如下,
bisal
2021/09/06
3.4K0
小白学习MySQL - 索引键长度限制的问题
MySQL 经典案例分析:Specified key was too long
迪B哥
2017/08/16
123.3K16
MySQL 经典案例分析:Specified key was too long
mysql索引过长Specialed key was too long问题记录
在创建要给表的时候遇到一个有意思的问题,提示Specified key was too long; max key length is 767 bytes,从描述上来看,是Key太长,超过了指定的 767字节限制
玖柒的小窝
2021/11/07
6970
MySQL中索引创建错误的场景
从这个提示,可以知道是给T表的reg_code字段创建一个BTREE索引,而这个reg_code列的字段类型是BLOB或TEXT,错误信息说的是需要在键的说明中有长度定义,这是什么意思?
bisal
2023/09/21
3990
MySQL中索引创建错误的场景
技术分享 | MySQL 索引长度限制的案例
网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升方面的工作,Oracle ACE ,拥有 Oracle OCM & OCP 、EXIN DevOps Master 、SCJP 等国际认证,国内首批 Oracle YEP 成员,OCMU 成员,《DevOps 最佳实践》中文译者之一,CSDN & ITPub 专家博主,长期坚持分享技术文章,多次在线上和线下分享技术主题。
爱可生开源社区
2021/12/07
4.1K0
技术分享 | MySQL 索引长度限制的案例
MySQL故障案例 | ERROR 1071 (42000): Specified key was too long
https://dev.mysql.com/doc/refman/5.7/en/innodb-limits.html
凡人学运维
2022/06/22
2K0
小白学习MySQL - 变通创建索引的案例一则
前两天同事提了一个问题,MySQL 5.7中给某张表字段增加一个单键值索引,提示了如下错误,
bisal
2021/12/05
4980
小白学习MySQL - 变通创建索引的案例一则
故障分析 | ERROR 1709: Index column size too large 引发的思考
某日同事突然找到我说测试环境中有张表无法访问,SELECT、DML 和 DDL 执行均报错 ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.。
爱可生开源社区
2024/09/14
2120
故障分析 | ERROR 1709: Index column size too large 引发的思考
mysql使用联合索引提示字符长度超限制解决办法
mysql在创建数据库的时候,字符集设置的不是utf8而是utf9mb4,在导入sql脚本的时候,发现提示如下错误:
凯哥Java
2020/01/05
4K0
mysql使用联合索引提示字符长度超限制解决办法
故障分析 | 一个索引创建错误引发的思考
作者:刘晨,网名 bisal ,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升和技术管理相关的工作,Oracle ACE(Alumni),腾讯云TVP,拥有 Oracle OCM & OCP 、EXIN DevOps Master 、SCJP 等国际认证,国内首批 Oracle YEP 成员,OCMU 成员,《DevOps 最佳实践》中文译者之一,CSDN & ITPub 专家博主,公众号”bisal的个人杂货铺”,长期坚持分享技术文章,多次在线上和线下分享技术主题。
爱可生开源社区
2023/09/20
2510
故障分析 | 一个索引创建错误引发的思考
1071 - Specified key was too long; max key length is 767 bytes
今天在Mysql建表的过程中,遇到了一个这样的问题,错误信息 1071 - Specified key was too long; max key length is 767 bytes
六月的雨在Tencent
2024/04/08
2.7K0
1071 - Specified key was too long; max key length is 767 bytes
MySQL原理 - InnoDB表的限制
目前OLTP业务的表如果是使用MySQL一般都会使用InnoDB引擎,这也是默认的表引擎。那么这种引擎有什么限制呢?根据官方文档总结下:
干货满满张哈希
2021/04/12
1.5K0
每日一面 - 从 innodb 的索引结构分析,为什么索引的 key 长度不能太长?
然后,就需要提到一个概念,innodb_page_size。InnoDB引擎读取数据,是一页一页读取的,这是InnoDB读取一页数据的大小。 innodb_page_size 是一个初始化数据库实例的参数,在目前的版本中(>=5.7.6),可以选择的值有4096, 8192, 16384, 32768, 65536。默认是16KB
干货满满张哈希
2021/04/12
7490
每日一面 - 从 innodb 的索引结构分析,为什么索引的 key 长度不能太长?
小白学习MySQL - varchar类型字段为什么经常定义成255?
很多时候我们看到一些表字符串类型的字段定义为varchar(255),开始以为varchar只能定义为255这个长度值,其实不然。
bisal
2021/12/30
1.2K0
小白学习MySQL - varchar类型字段为什么经常定义成255?
MYSQL INNODB表压缩
压缩前提 表压缩能提升性能,减少存储空间,主要是用在字符类型比较大的表上(VARCHAR,VARBINARY和BLOB和TEXT类型),且读多写少的情况下,如果你的应用是io密集型的,不是cpu密集型的,那么压缩会带来很多性能的提升,例如:数据仓库。 innodb_file_format = Barracuda --模式支持压缩 innodb_file_per_table = on --必须是独立表空间 压缩原理 InnoDB支持两种文件格式 Antelope(羚羊)和Barracuda(梭鱼): Ante
MySQL轻松学
2018/03/09
9.7K0
MYSQL INNODB表压缩
MySQL中char、varchar和text的设计
1、char(n)和varchar(n)中括号中n代表字符的个数,并不代表字节个数,所以当使用了中文的时候(UTF8)意味着可以插入m个中文,但是实际会占用m*3个字节。
田维常
2020/04/14
2.2K0
MySQL中char、varchar和text的设计
【MySQL经典案例分析】关于数据行溢出由浅至深的探讨
故事的开头我们先来看一个常见的sql报错信息, 相信对于这类报错大家一定遇到过很多次了...
迪B哥
2018/12/20
2.9K3
MySQL 线上2个小案例
今天在线上遇到2个很有意思的MySQL案例,都是比较经典的问题,拿出来跟大家分享一下。为了对库表名称进行脱敏,我把问题抽象出来两个小的例子,且看分享。
AsiaYe
2022/12/07
4430
推荐阅读
相关推荐
索引长度过长 ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验