IT技术博客大学习 共学习 共进步

关于InnoDB索引长度限制的tips

MySQLOPS 数据库与运维自动化技术分享 2012-09-19 23:31:37 累计浏览 3,363 次

有同学问到MySQL数据库InnoDB存储引擎的索引长度问题,简单说几个tips。

关于3072

大家经常碰到InnoDB单列索引长度不能超过767bytes,实际上联合索引还有一个限制是3072。

可以看到,由于每个字段占用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. 由浅入深探究mysql索引结构原理、性能分析与优化 (累计阅读 16,124)
  2. 浅谈MySQL索引背后的数据结构及算法 (累计阅读 11,386)
  3. 由浅入深理解索引的实现(2) (累计阅读 7,524)
  4. HBase二级索引与Join (累计阅读 6,862)
  5. 如何建立合适的索引? (累计阅读 6,667)
  6. mysql查询中利用索引的机制 (累计阅读 6,584)
  7. InnODB和MyISAM索引统计集合 (累计阅读 6,084)
  8. Innodb 表和索引结构 (累计阅读 6,044)
  9. MySQL索引背后的数据结构及算法原理 (累计阅读 5,624)
  10. mysql索引浅析 (累计阅读 5,185)