组合索引长度之和大于 767 bytes并没有影响,当有某个字段定义长度大于 767 bytes(1000*3)时,仅产生告警,但不影响建立,超长字段会取前 255 字符做为前缀索引,而且组合索引中字段出现的顺序并没有关系。数据库
为何3072
InnoDB一个page的默认大小是 16 k。因为是Btree组织,要求叶子节点上一个page至少包含两条记录(不然就退化链表了)。因此一个记录最多不能超过 8 k。又因为InnoDB的聚簇索引结构,一个二级索引要包含主键索引,所以每一个单个索引不能超过 4 k(极端状况,pk和某个二级索引都达到这个限制)。因为须要预留和辅助空间,扣掉后不能超过 3500 ,取个“整数”就是(1024*3)。ui
单列索引限制
默认状况下,InnoDB 引擎单一字段索引的长度最大为 767 字节,一样的,前缀索引也有一样的限制。当使用 UTF-8 字符集,每个字符使用 3 字节来存储,767=256*3-1,在 TEXT 或者 VARCHAR 类型的字段上创建一个超过 255 字符数的前缀索引时就会遇到问题。至于为何字符长度限制在 256 内,我猜是为提升索引效率,应为varchar类型须要额外的字节保留其长度信息,256 就将其限定在一个字节了。可是在5.5之后,开始支持4个字节的uutf8。255×4>767, 因而增长了一个参数叫作innodblargeprefix。这个参数默认值是OFF,当改成ON时,容许列索引最大达到 3072 字节。要求表的 row_format 须要使用 compressed 或者 dynamicorm
使用前缀索引带来的风险:
INNODB的索引会限制单独Key的最大长度为 767 字节,超过这个长度必须创建小于等于 767 字节的前缀索引。 此外,BLOB和TEXT类型的列只能建立前缀索引。 前缀索引能提升索引创建速度和检索速度,可是下面状况是没法使用前缀索引的:排序
索引覆盖扫描
经过索引的排序(order by, group by)
修改索引限制长度须要在my.ini配置文件中添加如下内容,并重启:索引
#修改单列索引字节长度为767的限制,单列索引的长度变为3072it
innodb_large_prefix=1
# Antelope(羚羊)是Built-in-InnoDB(MySQL内置的InnoDB)支持文件格式的代号,有两种“数据表格式”(row_format):Redundant(冗余)、Compact(紧凑)
#Barracuda(梭子鱼)是InnoDB Plugin支持的文件格式,在原来的基础上新增了两种数据表格式的支持:Dynamic 和 Compressed
#innodb_file_format在配置文件中指定;row_format则在建立数据表时指定
#同时Barracude也支持 old redundant and compact row formats
innodb_file_format=BARRACUDA
#InnoDB Plugin引入的新的文件格式,也引入较为完整的文件兼容性检查,以防止误操做非兼容的文件格式。兼容性检查一共有三类:启动数据库时、建立数据表时、访问数据表时。
#当数据库启动时候,参数innodb_file_format_check(>=5.1.38)会要求InnoDB在启动时检查当前数据表的格式。设置为ON时,若是检测到不支持的格式,那么InnoDB会启动失败;设置为OFF时,检测到不支持的仅会给出警告,并不会致使启动失败。
#当建立数据表时,InnoDB会依据参数InnoDB_file_format进行检查,若是建立的数据表格式高于InnoDB_file_format,则建立会失败。
#当访问某个数据表(table-access)时,InnoDB也会进行兼容性检查。只要当前运行的InnoDB版本可以支持的格式,都可以被访问,不管参数InnoDB_file_format的配置。
#把innodb_file_format_check设置为OFF是很危险的。在InnoDB启动后,通常须要作一些恢复工做,例如Double write buffer/Insert buffer中的数据处理(这依赖于innodb_fast_shutdown参数),试想若是成功启动,可是某些表是不支持的格式,可是InnoDB仍然安装旧版本作恢复,这可能会毁掉相关数据。
#因此,通常建议innodb_file_format_check设置为ON。若是是OFF,关闭InnoDB的innodb_fast_shutdown参数务必设置成0
innodb_file_format_check=1innodb
在建立表的时候须要指定表的行格式为dynamic ROW_FORMAT=DYNAMIC;
---------------------
table