`
丁林.tb
  • 浏览: 789569 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于InnoDB索引长度限制的tips

阅读更多

有同学问到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  。

1
0
分享到:
评论

相关推荐

    MySQL Innodb 索引原理详解

    MySQL Innodb 索引原理详解

    关于InnoDB的索引大小

    NULL 博文链接:https://dinglin.iteye.com/blog/1682188

    辛星笔记之InnoDB索引

    辛星笔记之MySQL部分之InnoDB引擎的索引部分。

    MySQL索引长度限制原理解析

    这篇文章主要介绍了MySQL索引长度限制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 索引 TextField是不支持建立索引的 MySQL对索引字段长度有限制 ...

    1.1.6 从innodb的索引结构分析,为什么索引的 key 长度不能太长.md

    1.1.6 从innodb的索引结构分析,为什么索引的 key 长度不能太长

    002.InnoDB索引与MyISAM索引实现的区别是什么?.mp4

    InnoDB索引与MyISAM索引实现的区别是什么?.mp4 InnoDB索引与MyISAM索引实现的区别是什么?.mp4 InnoDB索引与MyISAM索引实现的区别是什么?.mp4 InnoDB索引与MyISAM索引实现的区别是什么?.mp4 InnoDB索引与MyISAM...

    浅析InnoDB索引结构

    InnoDB表的索引有哪些特性,以及索引组织结构是怎样的 1、InnoDB聚集索引特点 我们知道,InnoDB引擎的聚集索引组织表,必然会有一个聚集索引。 行数据(row data)存储在聚集索引的叶子节点(除了发生overflow的列,...

    深入讲解MySQL Innodb索引的原理

    主要给大家介绍了关于MySQL Innodb索引原理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    一文搞定InnoDB索引

    关于InnoDB索引及相关知识的个人理解,如遇错误欢迎指正。 目录InnoDB的索引聚集索引(clustered index)普通索引(secondary index)回表是什么覆盖索引/索引覆盖(covering index)回到普通索引(Secondary indexes)索引...

    mysql,innodb索引介绍

    BTree索引的基本概念,优劣势,分裂问题,explain输出解释,如何使用optimizer trace

    MyISAM与InnoDB的索引差异

    MyISAM和InnoDB都使用B+树来实现索引: • MyISAM的索引与数据分开存储 • MyISAM的索引叶子存储指针,主键索引与普通索引无太大区别 • InnoDB的聚集索引和数据行统一存储 • InnoDB的聚集索引存储数据行本身,普通...

    浅谈innodb的索引页结构,插入缓冲,自适应哈希索引

    下面小编就为大家带来一篇浅谈innodb的索引页结构,插入缓冲,自适应哈希索引。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    MyISAM和InnoDB索引引擎的B+树索引实现1

    2)辅助索引(Secondary key)在 MyISAM 中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求 key 是唯

    innoDB 索引结构详解

    1、数据库索引 innoDB和MyISAM对比 区别 innoDB MyISAM 事物支持 支持 不支持 锁粒度 行锁 表锁 并发性 高并发 低并发 构成结构和缓存机制 数据和索引文件都存在在.Idb文件里,并且都缓存在内存里。 ...

    Mysql InnoDB引擎的索引与存储结构详解

    主要给大家介绍了Mysql InnoDB引擎的索引与存储结构的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧

    MySQL技术内幕 InnoDB存储引擎.pdf

    最近在学习MySQL技术内幕 InnoDB存储引擎 第2版,整理了一些文档分享出来,同时也方便以后查看。若有不当之处,烦请批评指正。 1. MySQL体系结构和存储引擎 2. InnoDB存储引擎 2.1 InnoDB体系结构 2.2 ...

    InnoDB 表的限制

    NULL 博文链接:https://hb-yym-929.iteye.com/blog/1177500

    mysql内核 innodb存储引擎

    《MySQL技术内幕:InnoDB存储引擎》是国内目前唯一的一本关于InnoDB的著作,由资深MySQL专家亲自执笔,中外数据库专家联袂推荐,权威性毋庸置疑。内容深入,从源代码的角度深度解析了InnoDB的体系结构、实现原理、...

Global site tag (gtag.js) - Google Analytics