SQL 优化实战案例
候选人小李在阿里 P6+ 面试中,面试官问:
"你最近优化过哪些 SQL?说一个具体案例。"
小李说:"我优化过一个慢查询,加了索引,从 5 秒降到 200 毫秒。"
面试官追问:"怎么定位到这条慢查询的?怎么判断是索引问题?怎么验证优化效果?"
小李支支吾吾答不上来。
【面试官心理】 这道题我用来测试候选人有没有完整的 SQL 优化经验。能说出"加索引"的占 80%,能讲清楚定位、分析、验证全流程的占 30%。能说出自己压测数据的,基本都是 P6+。
一、慢查询定位 🔴
1.1 慢查询日志定位
1.2 performance_schema 定位
1.3 APM 工具定位
二、优化案例一:索引优化 🟡
2.1 问题发现
2.2 分析执行计划
问题:全表扫描 500 万行,只返回 20 行。
2.3 优化方案
2.4 优化效果
三、优化案例二:分页优化 🟡
3.1 深度分页问题
3.2 优化方案:游标分页
3.3 优化方案:延迟关联
四、优化案例三:JOIN 优化 🟡
4.1 大表驱动小表
4.2 避免 SELECT *
五、优化案例四:COUNT 优化 🟡
5.1 COUNT(*) 慢的问题
5.2 优化方案
六、优化 Checklist 🟡
6.1 索引设计
- WHERE 条件字段有合适索引
- ORDER BY 字段在索引中(方向一致)
- SELECT 字段在覆盖索引中
- 复合索引字段顺序正确
- 没有冗余索引
6.2 查询优化
- 避免 SELECT *
- 使用 LIMIT 限制返回行数
- 避免深度分页(使用游标)
- 避免函数和计算在索引列上
- 避免隐式类型转换
6.3 架构优化
- 大表定期归档
- 读多写少场景使用缓存
- 写多读少场景使用批量操作
【面试官心理】 能说出自己压测数据的候选人很少。如果能说出"优化前 3.5 秒,优化后 23 毫秒,提升 150 倍",我就会高看一眼。