单列索引的长度的限制

(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例:

> 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):

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)

参考:

https://blog.51cto.com/lee90/2087122

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

mysql 联合索引长度_MySQL 中索引的长度的限制相关推荐

  1. mysql中distinct走索引吗_MySQL中索引优化distinct语句及distinct的多字段操作

    MySQL通常使用GROUPBY(本质上是排序动作)完成DISTINCT操作,如果DISTINCT操作和ORDERBY操作组合使用,通常会用到临时表.这样会影响性能. 在一些情况下,MySQL可以使用 ...

  2. mysql联合唯一约束_MySQL中添加唯一约束和联合唯一约束

    在MySQL数据库中,经常会碰到由于业务需要添加唯一键约束,唯一键约束,可以在一个列上添加约束,也可以在多个列上添加唯一约束. 一.单列唯一约束 在一列上添加唯一约束,主要是让该列在表中只能有唯一的一 ...

  3. mysql varchar2多少合适_MySQL中varchar最大长度是多少(仅学习)

    目录 一. varchar存储规则: 二. varchar和char 的区别: ps :被问到一个问题:MySQL中varchar最大长度是多少? 1.限制规则 2.计算例子 3.varchar物理存 ...

  4. mysql int数据类型长度_mysql中int数据类型长度的问题

    在定义了mysql中int数据类型后,后面填写的长度有什么用呢?下文将对mysql中int数据类型长度进行详细的介绍,希望对您能有所帮助. mysql中int数据类型长度最大为11位,最少为4位,不够 ...

  5. mysql表date类型长度_mysql中数据类型的长度解释

    11.2. 数值类型 MySQL支持所有标准SQL数值数据类型.这些类型包括严格数值数据类型(INTEGER.SMALLINT.DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT.RE ...

  6. mysql获取当月最后一天_mysql中获取本月第一天、本月最后一天、上月第一天、上月最后一天

    mysql获取当月最后一天_mysql中获取本月第一天.本月最后一天.上月第一天.上月最后一天等等 转自: https://blog.csdn.net/min996358312/article/det ...

  7. mysql的学习要点_MySQL中的联合索引的学习要点总结

    MySQL中的联合索引的学习要点总结 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a ...

  8. mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...

    这里写目录标题 事故现场 解决方案 提到的"回表查询" InnoDB的索引 什么是回表查询 怎么优化回表查询 事故现场 数据库使用的MySQL,有一个日志表,需要进行分页查询,于是 ...

  9. mysql索引的使用及优化方法_MySQL中索引和优化的用法总结

    1.什么是数据库中的索引?索引有什么作用? 引入索引的目的是为了加快查询速度.如果数据量很大,大的查询要从硬盘加载数据到内存当中. 2.InnoDB中的索引原理是怎么样的? InnoDB是MySQL的 ...

最新文章

  1. 详解Java解析XML的四种方法
  2. java组长一个月工资多少,保准看明白!
  3. php 定义title,HTML5中对title属性的定义与规定
  4. iOS -OC调用js页面
  5. 【译】An Opinionated Introduction to AutoML and Neural Architecture Search
  6. 动态数组的定义和声明(c++)
  7. 九个著名科技公司的十位CEO的办公桌照片
  8. Java IO 系统
  9. jenkins+svn+maven+ssh 部署配置详细记录
  10. 决策树编程python_Python如何制定决策:编程中的控制流简介
  11. python爬取内容剔除nbsp_python 爬虫爬取内容时, \xa0 、 \u3000 的含义与处理方法...
  12. Linux的yum命令及基本用法
  13. LNK 2001:无法解析的外部符号 _sprintf
  14. 一个遮罩层怎么遮罩两个图层_遮罩动画只能有两个图层,上面为“遮罩层”,下面为“被遮罩”层。...
  15. 阿里巴巴python开发面试题_2019阿里巴巴面试题集锦(有答案哦),收藏!
  16. appium无法定位元素,TouchAction坐标定位工具
  17. Stochastic Weight Averaging
  18. 深入好文:数字经济技能:基于角色的数字技能培养方法、行业趋势、未来及未来的关键角色、这些角色的学习路径
  19. 苹果4如何添加时间插件_Pr快速批量制作和添加字幕,节省时间还不用插件的做法...
  20. shell in find exclude

热门文章

  1. 马斯克活猪脑机接口试验成功!多芯片植入,硬币大小,实时读取脑电波,已被批准人脑实验...
  2. 引入外部css_css
  3. cocos2d-js开发环境的搭建
  4. vc++从txt文件中读取数据
  5. NAACL | 通过对抗性修改,探究链接预测的鲁棒性和可解释性
  6. NLP(5) | 命名实体识别
  7. php嵌入html还是html嵌入php,php嵌入html有哪几种方法
  8. 24 式加速你的 Python
  9. 华南农业大学在Annual Review of Microbiology发表三篇综述文章
  10. 新年开工——相关性分析了解一下?