news 2026/6/5 5:09:13

被大厂面试官怼了:“我问你查询走没走索引,你凭直觉跟我说‘大概’?”,那一刻我汗流浃背了......

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
被大厂面试官怼了:“我问你查询走没走索引,你凭直觉跟我说‘大概’?”,那一刻我汗流浃背了......

最近面了几家公司,本来觉得自己对 MySQL 索引那几条规则(什么最左匹配、不要在索引列上做运算)背得挺溜,结果前两天被面试官当场上了一课。

面试官问:“你平时怎么判断你的 SQL 到底有没有用到索引?”

我当时自信满满地回答:“只要我按照最左前缀原则写 WHERE 条件,它肯定就走索引了啊。”

面试官听完,盯着我看了三秒钟:“肯定?数据库优化器(Optimizer)是你家开的吗?它走不走索引还得看数据量、回表成本和区分度。你就凭直觉跟我说‘大概’?”

那一刻,我真的汗流浃背了。

回来之后,我对着电脑把EXPLAIN彻底翻烂了。其实判断一个查询是否真的得到了索引,不能靠“我觉得”,得靠数据库给出的“证据”。


1. 唯一证据:EXPLAIN 命令

在 MySQL 里,不管是多么复杂的查询,只要在SELECT前面加上一个EXPLAIN,数据库就会把它的执行计划(Execution Plan)吐出来。

这就好比去医院照 B 超,医生一眼就能看出你肚子里到底是“真有货”还是“全是气”。

EXPLAIN SELECT * FROM user WHERE age = 20;

执行完后,你会看到一堆字段。别被那十来个列吓到,只要能看懂这四个核心字段,基本就能稳住面试官。


2. 第一看:key—— 到底最后用了谁?

这是最直接的指标。

  • possible_keys:代表 MySQL 觉得有哪些索引可以用。这只是“备胎”名单。

  • key:代表 MySQL 真正决定使用的索引。

如果key这一列是NULL,那完了,这查询妥妥地在全表扫描,索引没派上用场。


3. 第二看:type—— 走索引的方式“高级”吗?

这一列是描述查询性能的关键。它显示的是连接类型,从好到坏的常见排序是:

system > const > eq_ref > ref > range > index > ALL

  • const/eq_ref:这是顶级玩家。通常是你用主键(Primary Key)或者唯一索引(Unique Index)去查询。

  • ref:普通索引命中。

  • range:范围查询。比如WHERE age > 18。虽然用了索引,但要扫一段范围。

  • index:全索引扫描。虽然也是扫索引树,但它是把整个索引树翻一遍,性能只比全表扫描好一丁点。

  • ALL:全表扫描。看到这个,直接原地反思代码。


4. 第三看:key_len—— 索引被“吃”了多少?

这是最容易被忽略、但也最能体现水平的指标。它表示索引使用的字节长度。

如果你建了一个联合索引(a, b, c),通过key_len你能判断出 MySQL 到底是只用了a,还是用了ab,甚至是a, b, c全用了。

  • 如果你的索引是int类型且允许为NULLkey_len通常是 5 字节(4 字节数据 + 1 字节标识位)。

  • 如果key_len比你预想的短,说明你的联合索引可能发生了“索引截断”,后面的字段失效了。


5. 第四看:Extra—— 那些隐藏的“潜规则”

这一列经常会出现一些很重要的额外信息:

  • Using index这是满分表现!说明发生了“索引覆盖”,你要的数据在索引树里全都有,根本不需要去磁盘回表查整行数据。

  • Using index condition:说明用了“索引下推(ICP)”,MySQL 在扫索引时就把不符合条件的过滤掉了,减少了回表次数。

  • Using filesort/Using temporary这是警告信号!说明 MySQL 没法利用索引排序,只能在内存甚至磁盘里自己排序,或者建了临时表。看到这个,你的 SQL 性能通常要拉胯。


总结:别凭直觉,看执行计划

以前我写代码总觉得“我写了索引,它就该生效”。但现实是,如果 MySQL 觉得全表扫描比走索引再回表还要快(比如你的WHERE条件过滤掉了 90% 以上的数据),它就会果断抛弃你的索引。

面试官怼得对:在技术面前,直觉是最不靠谱的东西。

下次再有人问你:“你怎么知道索引生效了?”

请冷静地回答他:“我会通过 EXPLAIN 查看 key 是否命中了索引,并结合 type 和 key_len 判断索引利用的广度和深度,最后通过 Extra 确认是否存在回表或索引覆盖。”

这一套词下来,估计面试官端着咖啡的手也要颤抖一下了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 15:40:09

构筑测试事业的北极星——软件测试愿景制定指南

为什么测试团队需要明确的愿景? 在瞬息万变的软件开发领域中,软件测试作为质量保障的核心环节,常常陷入被动响应的工作模式——追逐不断变更的需求,应对持续迭代的产品,处理突发的线上问题。这种被动姿态不仅使测试人…

作者头像 李华
网站建设 2026/6/5 6:56:47

如何在没有经费的情况下做科研

实验的家伙事 在做这个工作之前,笔者的主业是合成生物学与分子生物学,见我之前的博文《质粒拷贝数以及启动子活性的定量测量》。在研究过程中有一些发现,也积累了几个点子和想法。然而这些想法无一实现,主要问题是没有钱和资源来…

作者头像 李华
网站建设 2026/6/4 13:48:34

打造自己的Python工具集

最近在使用Jep(Java Embedded Python)做一个Java调用Python代码的案例(一种在网页上编写并支持代码即时运行)时发现一个问题。由于每个人都在页面上编写属于自己的python脚本,而这些python脚本可能会使用一些诸如计算时…

作者头像 李华
网站建设 2026/6/2 20:49:19

25、Linux文本处理工具:从补丁应用到拼写检查

Linux文本处理工具:从补丁应用到拼写检查 1. 补丁应用 在文件处理中,我们常常需要将旧文件更新为新文件。当差异文件(diff file)创建好后,就可以使用它来给旧文件打补丁,将其转化为新文件。操作步骤如下: 1. 创建差异文件:使用 diff 命令生成差异文件。例如,对比…

作者头像 李华
网站建设 2026/6/4 21:49:54

27、文档格式化与打印:Unix/Linux 实用指南

文档格式化与打印:Unix/Linux 实用指南 文档格式化系统 在处理小型简单的文本任务时,简单的文本格式化工具表现出色。但对于大型任务,Unix 系统提供了更强大的工具,这也是它在技术和科学用户中广受欢迎的原因之一。实际上,文档处理对 Unix 的发展起到了重要作用。 早期…

作者头像 李华