文章目录
前言
最近帮公司面试了二十几个后端开发,发现很多工作3年+的候选人竟然答不上MySQL的聚簇索引原理!!!(惊掉下巴)今天特意整理了MySQL最高频的8个面试考点,附带真实场景解析。准备面试的同学赶紧收藏,文末还有独家整理的《MySQL性能调优手册》获取方式~
一、存储引擎的生死抉择
1.1 InnoDB vs MyISAM 世纪大战
这俩兄弟的区别堪称MySQL界的"甜咸之争"(必考题!)
InnoDB | MyISAM | |
---|---|---|
事务 | ✅ 支持 | ❌ 不支持 |
外键 | ✅ 支持 | ❌ 不支持 |
锁粒度 | 行级锁 | 表级锁 |
崩溃恢复 | 支持事务日志恢复 | 需手动修复 |
存储文件 | .ibd数据+索引 | .MYD数据+.MYI索引 |
实战场景:电商系统订单表突然暴增到500万条,这时要把MyISAM引擎换成InnoDB吗?(思考3秒)
答:必须换!MyISAM的表级锁会导致高并发下单操作出现严重阻塞。曾经有个项目没及时切换引擎,大促时直接导致数据库连接池爆满(血泪教训!)
二、索引的七十二变
2.1 B+树索引的魔法结构
(掏出笔在白板上画个树状图)B+树的三大特征:
- 叶子节点形成有序链表
- 非叶子节点只存索引键
- 所有数据都存在叶子节点
为什么不用二叉树? 当数据量达到百万级时,二叉树可能退化成链表,而B+树始终保持矮胖体型,3层就能存2000万数据!
2.2 最左前缀原则的坑
创建了复合索引 (name, age, gender),以下哪些SQL能用上索引?
SELECT * FROM users WHERE age=25; -- ❌
SELECT * FROM users WHERE name='老王' AND gender='男'; -- ✅(但只用到name)
SELECT * FROM users WHERE name LIKE '张%' AND age>30; -- ✅(范围查询后断桥)
避坑指南:把区分度高的字段放前面,范围查询字段放最后
三、事务的四大护法(ACID)
3.1 隔离级别的修罗场
用个外卖订单的例子解释四个级别:
- 读未提交:看到厨师刚接单但没开始做
- 读已提交:看到厨师开始炒菜
- 可重复读(默认):保证整个用餐过程订单状态不变
- 串行化:包厢一次只接待一桌客人
幻读现形记:可重复读级别下,别的事务插入新数据会被当前事务的当前读发现(快照读看不到)
四、锁机制的江湖恩怨
4.1 行锁/表锁/间隙锁
- 记录锁:锁住某条具体记录(比如id=5)
- 间隙锁:锁住id>5 and id<10的区域(防止幻读)
- Next-Key锁:记录锁+间隙锁组合拳
死锁现场:事务A先更新id=1再更新id=2,事务B先更新id=2再更新id=1。解决方案:按固定顺序访问资源
五、SQL优化的降龙十八掌
5.1 EXPLAIN命令详解
重点关注这些列:
- type:最好到ref级别
- rows:扫描行数
- Extra:出现Using filesort赶紧优化
5.2 慢查询日志分析实战
配置参数:
slow_query_log = ON
long_query_time = 1 # 超过1秒的记录
slow_query_log_file = /var/log/mysql/slow.log
案例分析:某分页查询耗时5秒,优化方案:
# 原始写法
SELECT * FROM orders LIMIT 1000000,20;
# 优化写法(利用覆盖索引)
SELECT * FROM orders WHERE id > 1000000 LIMIT 20;
六、分库分表的乾坤大挪移
6.1 水平拆分 vs 垂直拆分
- 水平:按订单id取模分表
- 垂直:把用户基本信息表和扩展表分开
分库策略:用户维度分库(用户1-100万在库1,100-200万在库2)
6.2 分布式ID生成方案对比
- 数据库自增ID:简单但扩展性差
- UUID:太长且无序
- Snowflake算法:推荐!美团Leaf、百度UidGenerator都是优秀实现
七、主从复制的镜像世界
7.1 复制原理三部曲
- Master写binlog
- Slave的IO线程拉取日志
- SQL线程重放日志
延迟解决方案:
- 半同步复制(保证至少一个Slave收到)
- 并行复制(5.7+版本支持)
八、终极拷问:你说精通MySQL?
如果面试官抛出这个问题,建议分层次回答:
- 基础:熟练掌握SQL编写、索引优化、事务控制
- 进阶:有分库分表实战经验,处理过死锁问题
- 深度:研究过InnoDB源码,做过定制化开发
最后反问:“咱们业务现在遇到哪些MySQL方面的挑战?”(瞬间提升逼格)
附赠:《MySQL性能调优手册》获取方式
关注公众号【技术π】,回复"mysql666"领取包含:
- 20个经典调优案例
- 索引设计checklist
- 压测脚本模板
- 参数优化指南
(偷偷说:手册里还有我整理的MySQL 8.0新特性脑图哦~)
总结
掌握这些知识点,MySQL相关面试通过率至少提升80%!但纸上得来终觉浅,建议大家自己动手实践:用docker起个MySQL环境,故意制造慢查询、死锁等场景,亲身体验排查过程。遇到问题欢迎在评论区交流,看到都会回复~