MySQL 面试题是个很神奇的东西:网上版本一大堆,九成都停留在“默写答案”层面;真正到了面试追问、现场调优、线上故障复盘的时候,很多背过题的人一下子就露馅了。我自己从开发转 DBA,后来也做过技术面试官,一个很深的体会是——面试官问 MySQL,不是考你会不会背命令,而是看你是“用过数据库”,还是“想明白数据库”的人。这次我把工作里踩过的坑、社区里被反复追问的高频题重新梳理了一遍,归纳成 7 大领域共 50 道经典题,覆盖 SQL 基础、索引、事务、存储引擎、锁、主从复制、运维排障和真实场景设计。
这篇文章不会给你一份“标准答案合集”,而是把每类题目的复习逻辑、答题主线和容易忽略的深挖点拆开讲。准备跳槽的同学,可以把它当成自测清单;已经在做开发、运维的同学,从第七部分开始会更有感觉,因为那些问题基本都来自我能碰到的真实事故。
1. 领域一:SQL基础与数据检索,最先翻车的往往是这一块
1.1 为什么把SQL基础单独拎出来?
很多人的误区是“SQL 不就是 select 吗,有什么好复习的”。但面试官恰恰喜欢先用基础题暖场,再用追问判断你的熟练度。MySQL 底层是一个优化器驱动的数据库,SQL 写得好不好,直接决定有没有可能命中索引、扫描多少行、会不会产生临时表和文件排序。
这里最容易被追到的一个基础点,是 SQL 的逻辑执行顺序。注意我说的是“逻辑顺序”,因为优化器真正执行时可能会调整计划,但分析一条 SQL 的问题,还是要靠这条逻辑链:
FROM -> ON -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT
这条顺序能解释不少实用结论:WHERE 里不能使用 SELECT 中定义的别名,因为 WHERE 执行在 SELECT 之前;ORDER BY 可以使用别名,因为它在 SELECT 之后执行;GROUP BY 之后才能用 HAVING 过滤组。
1.2 先自测:这一组的8道题
我把这个领域常考的题固定在下面 8 道,编号 1-8,后面会统一汇总成 50 题的完整清单。
- 一条 SELECT 在逻辑上按什么顺序执行?为什么 WHERE 里不能直接用 SELECT 别名?
- LEFT JOIN 与
