关于InnoDB索引长度限制的tips

标签: MySQL | 发表时间:2012-09-19 23:31 | 作者:丁奇
出处:http://www.blogread.cn/it/

标签:   索引

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


相关 [innodb 索引 长度] 推荐:

关于InnoDB索引长度限制的tips

- - IT技术博客大学习
有同学问到MySQL数据库InnoDB存储引擎的索引长度问题,简单说几个tips. 大家经常碰到InnoDB单列索引长度不能超过767bytes,实际上联合索引还有一个限制是3072. 可以看到,由于每个字段占用255*3, 因此这个索引的大小是3825>3072,报错. 我们知道InnoDB一个page的默认大小是16k.

Mysql-innodb-B+索引

- - 掘金后端
这是读书笔记,Mysql,innodb系列一共3篇. Mysql-innodb-B+索引(本篇). Mysql-innodb-锁(预计20200523). Mysql-innodb-事务预计20200530). CREATE TABLE `aid_***_detail` ( //省略所有字段 PRIMARY KEY (`id`), KEY `range_idx` (`range_id`,`is_delete`,`range_detail_num`,`goods_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4复制代码.

MySQL InnoDB B+树索引

- - OurMySQL
B+树索引在DB中有一个特点就是高扇出性,一般在DB中B+树的高度在2-3层左右,也就意味着只需要2-3次的IO操作即可. 而现在的磁盘每秒差不多在100次IO左右,2-3次意味着查询时间只需0.02-0.03秒. InnoDB存储引擎表是索引组织表,即表中数据安装主键顺序存放. 而聚集索引就是按照每张表的主键构造一颗B+,并且叶节点存放着整张表的行记录数据,因此也让聚集索引也是索引的一部分.

Innodb索引和锁的学习笔记

- - 数据库 - ITeye博客
附录:前段时间学习了下innodb锁的相关知识,对锁和事务有了大体理解,这里做个小总结. 1.Innodb事务和锁的关系.    Innodb区别于MyISAM的两个特点就是Innodb对于事务的支持和对行锁的支持. 事务要求了一组SQL语句的ACID特性,同时为了避免对一行记录的并发更新,innodb本身会在一定情况下加锁,然后等语句所在的事务退出后(rollbak或者commit)释放锁.

建索引的原则-以innodb为例

- - CSDN博客推荐文章
随着开发、测试任务进入尾声,大家都在整理一些项目发布前的一些准备工作,其中一个重要的工作就是为之前写的一些sql语句建立索引,这高并发、高访问量的环境下是非常有必要的,建立一个好的索引能够极大地提高sql语句的查询效率,那么问题来了,到底什么是索引,怎样才能建立一个好的索引呢. 本文以mysql Innodb存储引擎为例,结合实际的项目来看一下,如何建立一个好的而索引.

InnoDB一定会在索引中加上主键吗

- - OurMySQL
DBA群里在讨论一个问题,到底InnoDB会不会在索引末尾加上主键,什么时候会加. 我之前看代码记得是如果索引末尾就是主键,那么InnoDB就不再添加主键了,如果索引末尾不是主键,那么会添加主键,但是这跟测试结果不符:. 插入部分数据后可以看到idx1和idx2两个索引的大小相同. 这说明idx1和idx2的内部结构是一样的,因此 不可能 是idx1在内部存为(a,b,a).

Mysql InnoDB锁

- - 数据库 - ITeye博客
抄自:http://www.cnblogs.com/qq78292959/archive/2013/01/30/2882745.html. Mysql常用存储引擎的锁机制. MyISAM和MEMORY采用表级锁(table-level locking). BDB采用页面锁(page-leve locking)或表级锁,默认为页面锁.

[MySQL优化案例]系列 — 索引、提交频率对InnoDB表写入速度的影响

- - MySQL中文网
本次,我们来看看索引、提交频率对InnoDB表写入速度的影响,了解有哪些需要注意的. 1、关于索引对写入速度的影响: a、如果有自增列做主键,相对完全没索引的情况,写入速度约提升 3.11%; b、如果有自增列做主键,并且二级索引,相对完全没索引的情况,写入速度约降低 27.37%;. 因此,InnoDB表最好总是有一个自增列做主键.

mysql中索引的索引长度问题

- - jackyrong
MySQL的每个单表中所创建的索引长度是有限制的,且对不同存储引擎下的表有不同的限制. 在MyISAM表中,创建组合索引时,创建的索引长度不能超过1000,注意这里索引的长度的计算是根据表字段设定的长度来标量的,例如:. 此时报错:Specified key was too long;max key length is 1000 bytes.

Mysql Innodb 引擎优化

- 彦强 - 阿辉的空间
作/译者:吴炳锡,来源:http://imysql.cn/ & http://www.mysqlsupport.cn 转载请注明作/译者和出处,并且不能用于商业用途,违者必究. InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎. InnoDB锁定在行级并且也在SELECT语句提供 一个Oracle风格一致的非锁定读.