文章目录
前言
最近帮学弟学妹做模拟面试,发现80%的同学栽在优化问题上(尤其是索引部分!!!)。今天给大家梳理10个高频优化面试题,附赠我当年斩获大厂offer的实战应答技巧,建议收藏反复食用!
一、索引优化篇(必考!)
Q1:B+树索引原理(送分题别丢分!)
这个问题看似基础,但能区分真懂和死记硬背。正确姿势:
- 先画图说明B+树结构(叶子节点双向链表连接)
- 举个图书馆查书的例子:“就像图书馆目录,非叶子节点是分类标签,叶子节点是具体书籍位置”
- 对比B树:“B+树所有数据都存在叶子节点,范围查询更快!”
Q2:索引失效的7种场景(90%面试官会追问)
这里最容易踩坑!划重点:
- ❌ 使用
!=
或not in
(特殊值除外) - ❌ 对索引列做运算:
where year(create_time)=2023
- ❌ 类型转换:
varchar
字段用数字查询 - ✅ 救命技巧:
explain
查看key_len
,长度不对就是部分失效!
-- 反面教材 --
SELECT * FROM users WHERE phone=13800138000; -- phone是varchar类型
Q3:联合索引的最左前缀原则(必考题变形)
别傻背概念!用快递柜举例:
- 索引
(省份,城市,街道)
就像取件码01-02-03
- 只查
城市
就像直接输入-02-
,系统不知道从哪找
实战技巧:遇到范围查询时,右侧索引失效:
-- 索引(a,b,c) --
where a=1 and b>2 and c=3 → 只用到了a和b
二、SQL语句优化篇(手撕代码环节)
Q4:EXPLAIN结果怎么看(面试官最爱追问)
记住三个关键指标:
type
列:至少达到range
级别rows
:估算扫描行数(越小越好)Extra
:出现Using filesort
立即报警!
Q5:深分页优化方案(阿里高频题)
当面试官问"100万数据怎么查第99999页",标准回答流程:
- 先否定
limit 99999,10
(产生临时表) - 方案一:
where id > 上页最大id limit 10
- 方案二:
inner join
先查id再回表 - 附加分:提到Elasticsearch分页方案
-- 优化方案示例 --
SELECT t.*
FROM table t
JOIN (SELECT id FROM table ORDER BY id LIMIT 999990,10) tmp
ON t.id = tmp.id
三、架构优化篇(P7级别考点)
Q6:什么时候需要分库分表?
别上来就提分库分表!正确思路:
- 先考虑硬件升级/读写分离
- 单表数据量达到500万(不是绝对!)
- 业务有明显分片特征(如按地区、时间)
Q7:分库分表后的ID冲突怎么办?
三板斧回答法:
- 雪花算法(时钟回拨问题要说明!)
- 数据库自增步长设置
- Redis分布式ID生成器
四、实战陷阱题(容易翻车!)
Q8:为什么我建了索引还是慢?
这个问题在考排查思路!标准回答模板:
- 确认是否走索引(explain验证)
- 检查数据倾斜(某个值占比过大)
- 统计信息过期(执行
analyze table
) - 锁竞争导致(show processlist)
Q9:count(*)和count(1)哪个快?
反套路回答:在MySQL 8.0之后没区别!
但可以延伸讨论:
- MyISAM引擎的count优化
- 带条件的count走索引情况
五、终极灵魂拷问
Q10:你说你做过优化,实际案例?
这里要准备两个故事模板:
- 索引优化案例:通过慢日志定位,添加缺失索引,响应时间从2s降到200ms
- 架构优化案例:将热点数据迁移到Redis,QPS从500提升到2000+
回答公式:问题现象 → 分析过程 → 解决方案 → 量化结果
避坑指南(血泪经验)
- 不要主动提"强制索引"(force index)
- 事务隔离级别要说清(尤其MVCC原理)
- 被问倒时可以说:“这个场景我确实没遇到过,但我理解应该是…”
附录:突击复习清单
- 手写索引树结构
- 背熟explain各字段含义
- 准备2个优化案例
- 练习limit深分页优化SQL
最后送大家一句话:优化没有银弹,一定要结合业务场景!(我上次就因为盲目加索引被CTD骂惨了…)