MySQL 一个面试问题的思考
背景
早上浏览了一篇"标题党"文章。内容主要是讲一个面试经历。在快速浏览双方对话过程中,面试官问题一个很有意思的问题:在 mysql 中一个表能创建多少个索引?面试者回答不太清楚。面试官让他回去可以百度一下。
分析
当我看到这个问题时,第一个反应是这个问题好像我也答不上来。逃出了我的知识网络结构中。我也好奇的去百度了一下。结构很多文章写的 16。我看到后给了自己连续的 3 个问号。我产生了如下的疑问:
从哪里获取的这个数值?很多文章中没有说明出处。
我认同任何一个事物都有它的范围,但是为什么是 16?
MySQL 哪个版本是这个限制?不同的版本对于索引都可能存在差异。
带着疑问我第一个做法就是快速的去验证这个说法。我启动了本地 MySQL,版本是 5.7.12.然后创建了一个简单的测试表。
快速的创建了 18 个索引:
结果是创建成功了~~
结论就是在 mysql 5.7.12 版本上这个所谓的最大值是错误的。那么最大值是多少呢?为什么很多文章要说 16 呢?我带着疑问去查看了 mysql 官方文档《Mysql 8.0 参考手册》。搜索索引关键字。发现了如下的说明:
每个表最多支持 64 个索引。 每个索引可以包含 1 到 16 列或部分列。 InnoDB 表 的最大索引宽度为 767 字节或 3072 字节。
也就是说,在创建组合索引的时候,最多只能有 16 个列。在 8.0 中每个表最多支持 64 个索引。问题也有了答案。经过实际测试在 mysql 5.7.12 版本上最大值也是 64.
思考
任何问题都需要有质疑的勇气。百度上的东西不一定都是对的。
如果有环境,最好的方式就是去动手实践一下。看看结果。
作为面试题,算是一个比较细的知识点。那么对于研发,我们需要对数据库的索引应该有什么样的了解呢?我的理解有这几个关键点:
索引的常见模型
InnoDB 的索引模型
索引长度对性能的影响
什么是回表
什么是覆盖索引
什么是前缀索引
评论