写点什么

MySQL 一个面试问题的思考

用户头像
薛腾
关注
发布于: 2020 年 10 月 11 日
MySQL一个面试问题的思考

背景

早上浏览了一篇"标题党"文章。内容主要是讲一个面试经历。在快速浏览双方对话过程中,面试官问题一个很有意思的问题:在 mysql 中一个表能创建多少个索引?面试者回答不太清楚。面试官让他回去可以百度一下。

分析

当我看到这个问题时,第一个反应是这个问题好像我也答不上来。逃出了我的知识网络结构中。我也好奇的去百度了一下。结构很多文章写的 16我看到后给了自己连续的 3 个问号。我产生了如下的疑问:

  1. 从哪里获取的这个数值?很多文章中没有说明出处。

  2. 我认同任何一个事物都有它的范围,但是为什么是 16?

  3. MySQL 哪个版本是这个限制?不同的版本对于索引都可能存在差异。

带着疑问我第一个做法就是快速的去验证这个说法。我启动了本地 MySQL,版本是 5.7.12.然后创建了一个简单的测试表。

create table test_max_index (  f1 int,  f2 int,  f3 int,  f4 int,  f5 int,  f6 int,  f7 int,  f8 int,  f9 int,  f10 int,  f11 int,  f12 int,  f13 int,  f14 int,  f15 int,  f16 int,  f17 int,	f18 int,	f19 int,	f20 int);
复制代码


快速的创建了 18 个索引:

create index idx_test_2 on test_max_index (f2);create index idx_test_3 on test_max_index (f3);create index idx_test_4 on test_max_index (f4);create index idx_test_5 on test_max_index (f5);create index idx_test_6 on test_max_index (f6);create index idx_test_7 on test_max_index (f7);create index idx_test_8 on test_max_index (f8);create index idx_test_9 on test_max_index (f9);create index idx_test_10 on test_max_index (f10);create index idx_test_11 on test_max_index (f11);create index idx_test_12 on test_max_index (f12);create index idx_test_13 on test_max_index (f13);create index idx_test_14 on test_max_index (f14);create index idx_test_15 on test_max_index (f15);create index idx_test_16 on test_max_index (f16);create index idx_test_17 on test_max_index (f17);create index idx_test_18 on test_max_index (f18);create index idx_test_19 on test_max_index (f19);
复制代码

结果是创建成功了~~

结论就是在 mysql 5.7.12 版本上这个所谓的最大值是错误的。那么最大值是多少呢?为什么很多文章要说 16 呢?我带着疑问去查看了 mysql 官方文档《Mysql 8.0 参考手册》。搜索索引关键字。发现了如下的说明:

每个表最多支持 64 个索引。 每个索引可以包含 1 到 16 列或部分列。 InnoDB 表 的最大索引宽度为 767 字节或 3072 字节。

也就是说,在创建组合索引的时候,最多只能有 16 个列。在 8.0 中每个表最多支持 64 个索引。问题也有了答案。经过实际测试在 mysql 5.7.12 版本上最大值也是 64.


思考

  1. 任何问题都需要有质疑的勇气。百度上的东西不一定都是对的。

  2. 如果有环境,最好的方式就是去动手实践一下。看看结果。

  3. 作为面试题,算是一个比较细的知识点。那么对于研发,我们需要对数据库的索引应该有什么样的了解呢?我的理解有这几个关键点:

  4. 索引的常见模型

  5. InnoDB 的索引模型

  6. 索引长度对性能的影响

  7. 什么是回表

  8. 什么是覆盖索引

  9. 什么是前缀索引


用户头像

薛腾

关注

二线城市奋斗的中年技术者,打不死的小强 2018.11.08 加入

还未添加个人简介

评论

发布
暂无评论
MySQL一个面试问题的思考