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。
可以看到默认行为是建表成功,报一个warning,并且将长度阶段为255。
注意要生效需要加row_format=compressed或者dynamic 。
如果确实需要在单个很大的列上创建索引,或者需要在多个很大的列上创建联合索引,而又超过了索引的长度限制,解决办法是在建索引时限制索引prefix的大小:
例如:create index yarn_app_result_i4 on yarn_app_result (flow_exec_id(100), another_column(50));
这样,在创建索引时就会限制使用的每个列的最大长度。如上的例子中,在创建联合索引时,最多使用列flow_exec_id中前100个字符创建索引,最多使用another_column中前
50个字符创建索引。这样子,就可以避免索引长度过大的问题。

最后,我想说一句。我们在设计数据库时,最好不要在一个可能包含很长字符串的列上创建索引,尤其是当这个列中的字符串都很长时。如果在这类列上创建了索引,那么在创建索引时以及根据索引查询时,都会浪费很多时间在计算和存储上。有经验的设计人员应该不会这样设计数据库。

最新文章

  1. 一次Mysql 死锁事故
  2. unicode编码与utf-8 区别
  3. python任务执行之线程,进程,与协程
  4. echart所有汉字都显示中文,就echarts的toolbox注释显示乱码
  5. 网页抓取:PHP实现网页爬虫方式小结
  6. Css3炫酷总结使用
  7. sql 学习笔记 p46
  8. Webservice-Java-CXF
  9. 【git 问题小说说】 git add时候报错:LF will be replaced by CRLF
  10. C++ 需要返回值的函数却没有返回值的情况 单例模式
  11. jq 测试是否到页面最底端
  12. Grunt + Bower—前端构建利器
  13. 以流方式读写文件:文件菜单打开一个文件,文件内容显示在RichTexBox中,执行复制、剪切、粘贴后,通过文件菜单可以保存修改后的文件。
  14. LODOP、C-Lodop简短排查语句
  15. Sql Server数据库之存储过程
  16. 将汉字转化为拼音的js插件
  17. Vue(基础七)_webpack使用工具(下)
  18. Android 8 蓝牙 扫描流程
  19. 调用shutdown.sh后出现could not contact localhost8005 tomcat may not be running报错问题
  20. Traceroute(路由追踪)的原理及实现

热门文章

  1. JOOQ 入门--简介
  2. linux 下格式化命令小记
  3. composer 的安装以及一些插件的下载等
  4. python_django_静态文件
  5. Hexo next主题添加站内搜索功能
  6. Replication Controller、Replica Set
  7. shell脚本中:单引号和双引号的区别
  8. 三种Spring加载机制
  9. mysql开启慢查询报错:
  10. php 即点即改