文章目录
前言:为什么优化是面试必考题?
最近帮朋友公司做技术面试,发现一个有趣现象——80%的候选人背得出索引原理,但被问到"线上慢查询怎么处理"时,答案就开始支支吾吾了(真实案例警告!)。这说明:死记硬背知识点已经不够用了,企业更看重实战中的优化能力!
一、索引优化(必考知识点!)
1.1 索引失效的六大经典场景
上周刚用这个案例难倒了一位3年经验的开发者:
-- 看似正常的查询为何全表扫描?
SELECT * FROM user WHERE YEAR(create_time) = 2023;
答案揭晓:对字段使用函数会导致索引失效!应该改为范围查询:
WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'
1.2 联合索引最左匹配原则实战
当面试官掏出这道题时,要当心了:
INDEX idx_a_b_c (a,b,c)
以下哪些情况能用上索引?
- WHERE b=1 AND a=2
- WHERE a>1 AND b=2
- WHERE a=1 ORDER BY c
踩坑预警:情况1虽然顺序颠倒,但优化器会自动调整;情况2范围查询后字段失效;情况3排序字段要出现在WHERE中才能用索引排序
二、查询优化三大杀手锏
2.1 EXPLAIN执行计划解读
最近面试发现,能看懂EXPLAIN结果的候选人薪资普遍高2K!重点看:
- type列:至少要到range级别
- Extra列:出现"Using filesort"立即警报!
- rows列:扫描行数超过1万就要警惕
2.2 慢查询日志分析实战
分享我的真实排查案例:
某电商平台突然出现大量超时,通过慢日志定位到:
SELECT * FROM orders
WHERE status IN (1,2,3)
ORDER BY create_time DESC
LIMIT 10
优化方案:改为固定排序条件+覆盖索引,响应时间从3.2秒降到80ms!
三、分库分表的艺术
3.1 什么时候该分表?
记住这个数字:单表超过500万行就要考虑拆分。但别急着拆!先尝试:
- 归档历史数据
- 垂直拆分大字段
- 使用分区表
3.2 分片键选择的陷阱
去年帮某社交平台做分库,踩过的坑你要避开:
- 不要用UUID作为分片键(会导致跨库查询)
- 时间字段分片要注意热点问题
- 用户ID取模是最常用方案,但要预留扩容空间
四、锁机制与事务优化
4.1 死锁现场还原
模拟一个经典死锁场景:
事务A先更新id=1,再更新id=2
事务B先更新id=2,再更新id=1
破局关键:所有事务按相同顺序获取锁
4.2 事务隔离级别选择
电商系统该用哪种级别?别直接背概念!要根据业务:
- 读已提交适合大部分场景
- 可重复读要注意幻读问题
- 串行化性能杀手慎用!
五、高频优化面试题精选
5.1 经典题型:大表添加索引
问:给1亿数据的表加索引要注意什么?
答:分阶段操作!先用pt-online-schema-change工具在线修改,避免锁表导致服务不可用
5.2 开放题:数据库突然变慢怎么排查?
参考思路:
- 检查慢查询日志
- 查看当前运行线程
- 监控锁等待情况
- 分析硬件资源使用率
- 检查是否有全表扫描
结语:优化是永无止境的修行
记得三年前我刚接触MySQL优化时,以为学会索引就万事大吉。直到遇到一个2000万数据的表,加了索引查询反而更慢(因为回表代价太高)!所以大家一定要:多实践、多踩坑、多总结。
最后送大家我的优化三定律:
- 能不用JOIN就不用
- 能走覆盖索引就别回表
- 能预计算就别实时算
(下次面试被问到优化问题,记得把本文案例甩出来,保证面试官眼睛发亮!)