有同学问到InnoDB的索引长度问题,简单说几个tips。
关于3072
大家经常碰到InnoDB单列索引长度不能超过767bytes,实际上联合索引还有一个限制是3072。
mysql> 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 `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
可以看到,由于每个字段占用255*3, 因此这个索引的大小是3825>3072,报错。
为什么3072
我们知道InnoDB一个page的默认大小是16k。由于是Btree组织,要求叶子节点上一个page至少要包含两条记录(否则就退化链表了)。
所以一个记录最多不能超过8k。
又由于InnoDB的聚簇索引结构,一个二级索引要包含主键索引,因此每个单个索引不能超过4k (极端情况,pk和某个二级索引都达到这个限制)。
由于需要预留和辅助空间,扣掉后不能超过3500,取个“整数”就是(1024*3)。
单列索引限制
上面有提到单列索引限制767,起因是256×3-1。这个3是字符最大占用空间(utf8)。但是在5.5以后,开始支持4个字节的uutf8。255×4>767, 于是增加了一个参数叫做 innodb_large_prefix。
这个参数默认值是OFF。当改为ON时,允许列索引最大达到3072。
如下效果(5.5):
可以看到默认行为是建表成功,报一个warning,并且将长度阶段为255。
注意要生效需要加row_format=compressed或者dynamic 。
分享到:
相关推荐
此外,InnoDB对索引长度有限制:对于主键,总长度不能超过767字节;对于辅助索引,总长度不能超过3072字节。 在设计索引时,应考虑以下几点: 1. 避免过大的索引:减少不必要的列或缩短列的长度可以减小索引大小。 ...
### MySQL Innodb 索引原理详解 #### 1. 各种树形结构 在深入探讨MySQL Innodb索引之前,我们先了解几种基本的树形数据结构,包括二叉搜索树、B树、B+树以及B*树。 ##### 1.1 搜索二叉树(Binary Search Tree) ...
### 辛星笔记之InnoDB索引 #### 第一节:算法基础 ##### 二分查找法 二分查找法(Binary Search),又称折半查找法,是一种高效的查找算法,适用于有序数组。它的工作原理是首先将目标值与数组中间位置的元素进行...
1.1.6 从innodb的索引结构分析,为什么索引的 key 长度不能太长
InnoDB索引与MyISAM索引实现的区别是什么?.mp4 InnoDB索引与MyISAM索引实现的区别是什么?.mp4 InnoDB索引与MyISAM索引实现的区别是什么?.mp4 InnoDB索引与MyISAM索引实现的区别是什么?.mp4 InnoDB索引与MyISAM...
索引长度也有一定的限制,取决于MySQL版本和字符集,通常每个索引键最多500字节。 6. **事务大小限制** InnoDB事务的大小受限于事务日志的大小,如果一个事务中修改的数据量过大,可能导致事务日志写满,从而引发...
页大小的改变会影响最大索引长度的限制。 创建一个简单的测试表`t1`,包含一个主键和两个辅助索引,然后插入数据,我们可以使用InnoDB提供的工具(如innodb_ruby和innblock)来查看表的索引结构。例如,`innodb_...
MySQL数据库的InnoDB存储引擎广泛使用BTree索引来优化查询性能。BTree索引是一种常见的索引类型,尤其适用于范围查询和排序操作。在MySQL中,InnoDB存储引擎的索引分为聚簇索引(主键索引)和非聚簇索引(二级索引)...
而辅助索引在InnoDB中则包含主键值,不存储数据记录的地址,这样在查询辅助索引时,系统需要先通过辅助索引找到主键值,然后再用主键值在主索引中找到数据行,这被称为“回表”。 MyISAM和InnoDB在索引实现上的差异...
MySQL索引长度限制是数据库设计中的一个重要因素,它直接影响到数据检索的速度和存储空间的效率。在MySQL中,不同的存储引擎对索引长度有不同的限制,这主要是由它们的内部实现和设计目标决定的。 首先,InnoDB引擎...
【MySQL InnoDB 索引页结构】 InnoDB存储引擎的索引是基于B树(B+Tree)实现的,无论是主键还是辅助键。索引页,也称为页节点,是InnoDB存储索引记录的基本单位,其默认大小为16KB。当新记录插入时,InnoDB会保留1/...
MySQL中的存储引擎MyISAM和InnoDB在处理索引上有显著的差异,这些差异主要体现在索引的组织方式以及对数据存储的影响上。两者都基于B+树这种高效的索引结构,但具体实现有所不同。 首先,MyISAM的索引采用非聚集...
关于InnoDB索引及相关知识的个人理解,如遇错误欢迎指正。 目录InnoDB的索引聚集索引(clustered index)普通索引(secondary index)回表是什么覆盖索引/索引覆盖(covering index)回到普通索引(Secondary indexes)索引...
【InnoDB 索引结构详解】 InnoDB和MyISAM是MySQL中两种常见的存储引擎,它们在事务处理、锁粒度以及并发性方面存在显著差异。InnoDB支持事务处理,提供行级锁,适合高并发环境。而MyISAM不支持事务,采用表级锁,...
MySQL数据库中,InnoDB存储引擎的索引与存储结构是数据库性能优化的关键,了解这些机制对于数据库管理员和开发人员至关重要。InnoDB是MySQL中支持事务处理的存储引擎,它具有ACID(原子性、一致性、隔离性、持久性)...
MySQL数据库系统提供了多种存储引擎,其中最常用的两种是MyISAM和InnoDB。它们各自具有独特的特性和适用场景,理解二者的性能差异对于优化数据库设计至关重要。 MyISAM引擎是MySQL早期的默认存储引擎,以其高速度和...