文章目录
一、索引篇:面试官最爱的灵魂拷问
1. B+树索引的底层设计有多精妙?
你造吗?MySQL的B+树结构就像俄罗斯套娃!叶子节点存放完整数据记录(聚簇索引)或主键值(非聚簇索引),非叶子节点纯属导航工具人。这种设计让查询稳定在O(log n)时间复杂度,就像坐电梯直达目标楼层一样高效!(这个设计真的绝了!)
2. 什么情况下索引会装死?
敲黑板!索引失效的六大死亡场景:
- 字段类型转换(比如字符串传了数字)
- 对索引列做了美容手术(函数操作)
- 联合索引的"左匹配原则"被打破
- 使用!=或<>这种负能量运算符
- 模糊查询的%挂在最前面
- 数据库觉得全表扫描更划算(比如查90%数据)
3. 覆盖索引究竟有多香?
举个例子:联合索引(name,age)
SELECT age FROM user WHERE name = '老王'
这种查询直接命中索引树,连数据页都不用翻!性能直接起飞,比普通索引快3倍不是梦!
二、事务篇:ACID四大护法全解析
1. 隔离级别与幻读的爱恨情仇
来看这张对比表(建议背下来!):
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | ✅ | ✅ | ✅ |
读已提交 | ❌ | ✅ | ✅ |
可重复读(默认) | ❌ | ❌ | ✅ |
串行化 | ❌ | ❌ | ❌ |
MySQL的杀手锏——间隙锁!专门收拾幻读这种妖魔鬼怪,在可重复读级别下也能保证事务安全(但性能会打点折扣)
2. MVCC实现原理大揭秘
版本链+ReadView的组合拳打得漂亮!每个事务开启时都会生成唯一ID,通过undo log构建版本链。读操作时根据事务ID判断哪些版本可见,这种无锁设计让并发性能直接拉满!
三、锁机制:高并发场景下的生死时速
1. 行锁的升级路线图
- 记录锁:精确打击单行
- 间隙锁:锁定范围空间
- 临键锁:记录锁+间隙锁的合体形态
- 插入意向锁:防止幻读的暗器
2. 死锁检测的骚操作
MySQL的等待图算法就像交通警察,发现环路立即出手:
- 回滚代价最小的事务
- 设置innodb_deadlock_detect=on自动检测
- 锁超时机制兜底(innodb_lock_wait_timeout)
四、性能优化:DBA的压箱底绝活
1. Explain执行计划解密
重点看这几个字段(划重点!):
- type:最好到ref级别
- key:实际使用的索引
- rows:估算扫描行数
- Extra:Using filesort/Using temporary要警惕
2. 慢查询优化三板斧
- 打开慢查询日志(long_query_time=2秒)
- 用pt-query-digest工具分析
- 优化索引+重写SQL+业务逻辑调整
五、高频灵魂拷问TOP5
1. 为什么推荐用自增主键?
- 插入性能好(避免页分裂)
- 存储空间小(int只要4字节)
- 范围查询快(顺序写入)
2. 线上count(*)突然变慢怎么办?
试试这三招:
- 用近似值(show table status)
- 加缓存计数器
- 用专门的统计表
3. 如何优雅地分页查询?
记住这个公式:
SELECT * FROM table
WHERE id > 上一页最后ID
ORDER BY id LIMIT 10
比传统的LIMIT偏移方案快10倍不止!
4. 大表DDL操作不锁表的秘密
Online DDL操作流程:
- 创建临时表
- 增量数据同步
- 原子性切换表名
配合pt-online-schema-change工具更香哦~
5. 主从同步延迟怎么破?
终极解决方案:
- 半同步复制(至少一个从库确认)
- 并行复制(设置slave_parallel_workers)
- MGR集群方案(组复制技术)
六、最新趋势:MySQL 8.0必考新特性
- 窗口函数(分析函数爽到飞起)
- 通用表表达式(WITH子句玩转复杂查询)
- 不可见索引(调试索引的神器)
- 原子DDL(再也不怕执行一半崩了)
- 资源组管理(CPU绑核技术)
最后的小贴士
面试前必做的三件事:
- 在本地用docker搭个MySQL环境实操
- 用sysbench做压测理解性能瓶颈
- 通读官方文档的InnoDB章节(真的会考文档细节!)
记住:MySQL面试不是背八股文,面试官最爱听你说"这个问题我在项目中遇到过,当时是这样解决的…"。理论+实战的组合拳,才是拿offer的王道!