大厂MySQL面试重在“考什么、怎么问、怎么答”三层逻辑,聚焦高频场景下的易错点:索引需闭环理解B+树原理、最左前缀法则与回表机制;事务要结合ACID定位问题,掌握MVCC与锁机制;分库分表强调动因与代价权衡;排查强调实战链路而非堆砌术语。

直击大厂Java MySQL面试,关键不是堆知识点,而是抓住“考什么、怎么问、怎么答”三层逻辑。大厂面试官不考冷门语法,专挑高频场景下容易出错、容易混淆、容易被忽略的点来验证你是否真懂。
MySQL索引:B+树、最左前缀、回表,三者必须闭环理解
光背“B+树比B树好”没用,得能讲清为什么——磁盘IO次数少、范围查询快、叶子节点链表结构支撑排序和分页。联合索引(a,b,c)不是“用了a就一定用b”,而是:a=1 and b=2 and c=3 ✅;a=1 and c=3 ❌(b跳过,c失效);a=1 and b>5 and c=3 ❌(c在范围后失效)。回表不是性能问题本身,而是非聚簇索引查到主键后再去聚簇索引捞数据的过程,优化方向就是覆盖索引(SELECT只查索引列)。
- 实操建议:用
EXPLAIN看type(避免ALL)、key(是否命中索引)、Extra(出现Using filesort或Using temporary就要警惕) - 陷阱提醒:LIKE 'abc%' 走索引,LIKE '%abc' 不走;
IS NULL在某些版本可能不走索引,!=或NOT IN大概率触发全表扫描
事务与锁:ACID不是背概念,是定位问题的坐标系
面试常问“转账失败怎么保证一致性”,答案不是“用事务”,而是要拆解:原子性靠undo log回滚,持久性靠redo log刷盘,隔离性靠MVCC+Next-Key Lock防幻读。InnoDB默认可重复读级别下,普通SELECT是快照读(不加锁),SELECT ... FOR UPDATE才是当前读(加行锁+间隙锁)。死锁不是“两个线程抢同一把锁”,而是A等B释放锁、B等A释放锁形成的循环等待——排查靠SHOW ENGINE INNODB STATUS看LATEST DETECTED DEADLOCK。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 实操建议:写SQL时主动思考“这条语句会加什么锁?锁住哪些记录+间隙?”比如
UPDATE user SET balance = balance - 100 WHERE id = 5,在RR级别下会对id=5这一行加记录锁,同时对(3,5)、(5,7)等间隙加间隙锁 - 陷阱提醒:“读已提交”下不可重复读是正常现象,不是bug;幻读在RR下仍可能发生(仅针对新插入的行),但InnoDB通过Next-Key Lock基本覆盖
分库分表:别只说“数据量大就拆”,要讲清拆的动因和代价
垂直分库是业务解耦(如用户库、订单库分离),水平分表是单表瓶颈(如订单表按user_id取模拆16张)。但拆完带来新问题:跨库join失效、分布式事务难、全局ID生成、扩容重分片成本高。所以大厂更倾向“先优化SQL+索引+缓存”,实在扛不住再拆——而且往往搭配中间件(ShardingSphere)或自研路由层,不是裸写分表逻辑。
- 实操建议:回答分表方案时,先说判断依据(单表超2000万行?慢查集中在某几个字段?QPS持续超5000?),再说选型(range/hash/sharding key选择),最后提兜底(扩容方案、数据迁移策略、降级开关)
- 陷阱提醒:不要说“用雪花算法生成ID就行”,得说明时钟回拨怎么处理、机器ID冲突怎么规避、ID趋势性对索引的影响
实战场景题:把知识串成解决路径,不是拼凑术语
比如被问:“线上服务突然响应变慢,监控显示DB CPU飙升,怎么排查?”这不是考你背多少命令,而是考排查链路:先看慢日志(slow_query_log)、再用SHOW PROCESSLIST抓活跃会话、结合EXPLAIN分析TOP SQL、检查是否有未提交事务阻塞、确认索引是否失效、观察是否发生锁等待或大事务。如果发现某条SELECT * FROM order WHERE status = 0扫了千万行,就该追问:status字段有没有索引?是否需要加复合索引(status, create_time)?能不能用归档表把历史数据移出?
- 实操建议:准备2–3个真实优化案例(哪怕模拟的),包含问题现象、分析过程、解决动作、效果验证(QPS提升X%、平均耗时从Yms降到Zms)
- 陷阱提醒:避免一上来就说“加索引”,先确认是不是SQL写法问题(如隐式类型转换导致索引失效)、是不是统计信息过期(
ANALYZE TABLE)、是不是参数配置不合理(innodb_buffer_pool_size太小)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










