关于InnoDB索引长度限制的tips

标签:   索引

有同学问到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. oracle索引扫描 [2012-05-12 22:22:25]
  2. oracle索引扫描 [2012-05-04 00:09:51]
  3. mysql查询中利用索引的机制 [2012-03-04 20:40:44]
  4. 由浅入深理解索引的实现(2) [2012-02-05 23:25:55]
  5. MySQL 数据库性能优化之索引优化 [2011-11-23 23:49:15]
  6. 浅谈MySQL索引背后的数据结构及算法 [2011-07-30 21:51:38]
  7. MySQL索引背后的数据结构及算法原理 [2011-07-18 12:45:29]
  8. mysql索引浅析 [2011-06-30 13:51:31]
  9. 框计算垂直搜索之索引篇 [2011-06-21 13:38:58]
  10. HBase二级索引与Join [2011-06-01 13:29:51]
  11. 冗余索引对查询效率的影响 [2010-09-24 23:47:45]
  12. Fastbit中的bitmap索引算法 [2010-08-19 09:21:03]
  13. ORACLE BITMAP INDEX [2010-05-25 13:31:12]
  14. Virtual Indexes [2010-04-12 09:21:01]
  15. 不平衡的索引? [2010-03-03 09:08:49]
  16. 为什么Oracle不使用我的索引?! [2010-03-03 09:08:17]
  17. Innodb 表和索引结构 [2010-02-26 09:07:49]
  18. Oracle索引abc [2010-02-08 23:49:41]
  19. mysql的全文索引限制 [2010-01-15 14:43:49]
  20. 多维度分类排行榜应用:用位图索引 [2009-11-09 09:27:32]
  21. mysql索引的一个技巧 [2009-10-29 08:45:27]
  22. Mysql combine index [2009-10-17 14:25:40]
  23. 如何建立索引 [2009-10-16 12:11:22]
  24. 如何建立合适的索引? [2009-10-11 22:31:21]
  25. Index Full Scans和Fast Full Index Scans的区别 [2009-10-11 22:24:35]


你可能感兴趣的:(mysql)