文章目录
Hey各位技术er!今天咱们来聊聊让无数候选人又爱又恨的MySQL面试题(擦汗)。作为一个经历过N场技术面试的老司机,我整理了一份2024年最可能被问到的15个灵魂拷问,准备好瓜子饮料,咱们发车!
一、索引连环问(必考题!!!)
1. B+树索引为什么比B树更适合数据库?
这里有个反常识的真相:B+树的数据全在叶子节点!(敲黑板)这意味着:
- 相同层高能存更多键值(中间节点不存数据)
- 范围查询直接遍历叶子链表,比B树快N倍
- 叶子节点形成有序链表,适合排序/分组操作
举个栗子🌰:查询age between 18-25的记录,B+树找到18后直接顺着链表扫,而B树需要在不同层级跳来跳去。
2. 最左前缀原则的隐藏坑
你以为(a,b,c)索引能覆盖所有查询?天真了!以下两种场景会翻车:
-- 情况1:跳过a直接查b
SELECT * FROM table WHERE b=1 AND c=2 ❌
-- 情况2:范围查询阻断后续列
SELECT * FROM table WHERE a>1 AND b=2 ❌(b列无法走索引)
(血泪教训)曾有个项目因为WHERE create_time>xxx AND status=1没走索引,直接把数据库CPU干到100%…
二、事务隔离的魔幻现实
3. RR级别真的不会幻读吗?
教科书都说Repeatable Read能防幻读,但MySQL官方文档打了脸(啪啪)!在RR级别下,普通SELECT确实可能幻读!
实验验证:
-- Session A
START TRANSACTION;
SELECT * FROM users WHERE age>20; -- 假设返回3条
-- Session B
INSERT INTO users(age) VALUES(25); COMMIT;
-- Session A 再次查询
SELECT * FROM users WHERE age>20; -- 还是3条?!
但如果你用SELECT ... FOR UPDATE,InnoDB会自动加间隙锁,这时候才能真正防幻读。是不是感觉被课本骗了十年?(手动狗头)
三、锁机制の黑暗森林
4. 死锁检测的骚操作
都知道死锁检测用wait-for graph,但MySQL有个神优化:当死锁检测成本超过回滚成本时,直接放弃检测!
这个阈值由innodb_deadlock_detect_delay控制(默认30ms)。意味着在高并发场景下,可能明明有死锁却不检测,直接超时回滚。是不是细思极恐?
5. 意向锁到底有啥用?
很多同学背了概念却不懂本质。意向锁其实是给表级锁打标记,避免出现:
- 已经有人加了行锁,另一个人想加表锁时需要全表扫描
- 不同事务的行锁互相冲突时无法快速判断
举个现实场景:当你给某行加X锁时,会自动给表加IX锁。这时如果有人想加表级X锁,看到IX就秒懂有行锁存在,不用傻等。
四、性能优化の玄学艺术
6. COUNT(*) 的惊天秘密
别再争论COUNT(*)和COUNT(1)了!真相是:
- MySQL 5.7之后两者完全等价
- 但
COUNT(col)有隐藏坑:它会跳过NULL值! - 最优解其实是
COUNT(*),因为引擎层做了专门优化
(冷知识)MyISAM的COUNT(*)为什么快?因为它把总行数存在了元数据里,前提是不能有WHERE条件!
7. JOIN查询的索引秘籍
记住这个黄金公式:小表驱动大表 + 被驱动表必建索引。比如:
-- 好学生写法
SELECT * FROM small_table s
JOIN big_table b ON s.id = b.sid ❤️(给b.sid加索引)
-- 作死写法
SELECT * FROM big_table b
JOIN small_table s ON b.sid = s.id 💣(全表扫描警告)
曾优化过一个7秒的查询,调整JOIN顺序+加索引后变成0.3秒,开发当场叫我爸爸(不是)。
五、新特性の吃蟹指南
8. 直方图统计的妙用
MySQL 8.0的直方图功能(HISTOGRAM)简直是优化器的外挂!它能解决数据分布不均导致的索引失效问题。
比如有个性别字段(90%男性),即使有索引,优化器也可能选择全表扫描。生成直方图后:
ANALYZE TABLE users UPDATE HISTOGRAM ON gender;
优化器瞬间开窍,对WHERE gender='F'果断走索引!
六、送命题の保命技巧
9. 主从延迟怎么破?
面试官最爱问的开放题,记住这三板斧:
- 半同步复制(牺牲性能换安全)
- 并行复制(设置slave_parallel_workers)
- 业务层妥协(重要操作走主库)
但有个骚操作你们可能不知道:在从库执行SELECT 1判断延迟?No!正确姿势是查Seconds_Behind_Master字段,但注意这个值可能是骗人的(网络中断时显示0延迟)!
最后の忠告
MySQL面试就像相亲,既要展示你的知识储备(索引/事务/锁),又要暴露你的实战经验(优化案例)。记住:每个错误答案背后,都是曾经的血泪史(别问我怎么知道的)。
准备好你的「最难忘故障案例」,当面试官眼睛发亮时,offer就离你不远啦!祝大家面试时都能像InnoDB一样——稳如老狗!(笑)
1493

被折叠的 条评论
为什么被折叠?



