文章目录
一、面试必问:说说你的SQL调优思路?
(每次面试必被问!)这个问题看似简单实则暗藏杀机,记住这个万能公式:
发现慢SQL → 定位瓶颈 → 优化方案 → 验证效果
但具体怎么做?咱们拆开细说:
1. 如何抓出慢查询?
- 开启慢查询日志(配置long_query_time参数)
- 使用SHOW PROCESSLIST实时监控
- MySQL 8.0+推荐用Performance Schema(新特性要会吹!)
2. 看执行计划的正确姿势
EXPLAIN SELECT * FROM users WHERE age > 18;
关键指标解读:
- type列要特别关注(ALL全表扫直接死刑!)
- possible_keys和key看是否走索引
- rows预估扫描行数(超过1万就要警惕)
- Extra出现Using filesort/Using temporary直接扣分!
3. 索引优化的骚操作
- 联合索引要遵循最左前缀原则(面试官最爱挖坑点!)
- 别在索引列做计算:
WHERE YEAR(create_time)=2023
❌ - 巧用覆盖索引减少回表(Extra出现Using index就对了)
- 前缀索引的正确打开方式:
ALTER TABLE users ADD INDEX (name(5))
二、真实案例:我搞垮过生产环境的那些SQL
案例1:分页查询的死亡陷阱
错误写法:
SELECT * FROM orders LIMIT 1000000, 10;
(结果数据库直接崩了!)
优化方案:
SELECT * FROM orders WHERE id > 1000000 ORDER BY id LIMIT 10;
案例2:JOIN引发的血案
三表联查突然变慢,执行计划显示全表扫描。最后发现:
- 缺失关联字段索引
- WHERE条件中的类型不匹配(varchar字段传了int值)
案例3:统计报表的午夜惊魂
SELECT COUNT(*) FROM user_logs;
(5000万数据直接卡死)
优化三部曲:
- 换用汇总表
- 使用EXPLAIN的rows近似值
- 上ClickHouse做离线分析
三、高级调优技巧(面试加分项!)
1. 参数调优三板斧
- innodb_buffer_pool_size(建议设置物理内存的70%)
- thread_cache_size(解决连接数暴涨问题)
- max_connections(别设太大!小心OOM)
2. 冷热数据分离方案
- 历史数据归档(用pt-archiver工具)
- 分库分表(推荐ShardingSphere)
- 上云数据库的读写分离功能
3. 锁机制避坑指南
- 慎用SELECT FOR UPDATE(搞不好就死锁)
- 批量更新拆分成小事务(避免大事务阻塞)
- 遇到死锁不要慌,用SHOW ENGINE INNODB STATUS查凶手
四、高频面试题灵魂拷问
Q1:为什么索引不生效?
- 字段类型不匹配(隐式转换)
- 使用函数或表达式
- like查询以%开头
- 不符合最左前缀原则
- 统计信息过时(记得analyze table)
Q2:大表加索引的正确姿势?
- 用pt-online-schema-change工具
- 在业务低峰期操作
- 监控服务器负载
Q3:如何优化深分页?
- 使用游标分页(where条件+自增ID)
- 改用Elasticsearch做搜索
- 禁止跳转任意页(产品经理最恨这招)
五、调优工具全家桶
- Percona Toolkit(DBA必备瑞士军刀)
- mysqldumpslow分析慢日志
- pt-query-digest做SQL审计
- Prometheus+Granfana监控体系
- 阿里云的DAS诊断服务(云厂商的羊毛要薅)
六、终极面试技巧
当被问到不会的问题时,可以这样应对:
“这个问题我之前没有实际处理经验,但根据我的理解,可能的解决思路是…(结合索引/执行计划/架构优化等原理展开)”
(划重点!)一定要展现出解决问题的思考过程,比直接背答案更重要!
最后说句大实话:
SQL调优没有银弹!需要结合业务场景具体分析。记住这个调优优先级:
索引优化 > 查询改写 > 参数调整 > 架构升级 > 换存储引擎
(别一上来就分库分表,小心被面试官怼!)