文章目录
一、索引优化的三大核心法则(必考!)
1.1 索引失效的六大经典场景
- 场景1:模糊查询左匹配(比如
LIKE '%张伟%'
)会导致索引失效!!!(重要指数⭐⭐⭐⭐⭐) - 场景2:字段类型隐式转换(比如varchar字段传了int值)会直接让索引罢工(血泪教训!)
- 场景3:函数操作字段(
WHERE YEAR(create_time)=2023
)会让索引当场宕机 - 实战案例:某电商平台商品表查询性能突然下降,最后发现是开发写了
WHERE left(product_code,3)='A01'
导致索引失效
1.2 复合索引的最左匹配原则
(划重点!)复合索引(a,b,c)
的正确打开方式:
- ✅
WHERE a=1 AND b=2
- ✅
WHERE a=1 ORDER BY b
- ❌
WHERE b=2 AND c=3
(直接GG) - ❌
WHERE a=1 OR b=2
(索引当场去世)
1.3 覆盖索引的妙用
当执行EXPLAIN
看到Using index
时(恭喜中奖!),说明:
- 查询字段全在索引中
- 不需要回表查数据
- 性能提升10倍不是梦(实测数据!)
二、慢查询分析的黄金三板斧
2.1 慢查询日志配置(5分钟上手)
-- 开启慢查询日志(建议测试环境使用)
SET GLOBAL slow_query_log = ON;
-- 设置慢查询阈值(单位:秒)
SET GLOBAL long_query_time = 1;
-- 日志文件路径
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
2.2 EXPLAIN结果解读秘籍
(面试官最爱问的字段TOP3):
- type列:从最好到最差排序
system > const > eq_ref > ref > range > index > ALL - Extra列:
- Using filesort(赶紧优化!)
- Using temporary(性能杀手!)
- Using index(优秀!)
- rows列:扫描行数越少越好
2.3 性能分析神器Show Profile
-- 开启profiling
SET profiling = 1;
-- 执行你的SQL
SELECT * FROM users WHERE...;
-- 查看结果
SHOW PROFILES;
-- 查看详细执行过程
SHOW PROFILE FOR QUERY 1;
(常见性能瓶颈):
- Sending data:网络传输过大
- Creating tmp table:临时表问题
- Sorting result:排序未走索引
三、参数调优的五个关键指标
3.1 连接池配置
# 重要参数(根据服务器配置调整)
max_connections=1000
wait_timeout=300
thread_cache_size=32
(避坑指南):连接数不是越大越好!超过实际CPU核心数反而会降低性能
3.2 InnoDB引擎优化
innodb_buffer_pool_size = 物理内存的70%
innodb_log_file_size = 1G
innodb_flush_log_at_trx_commit = 2
(调优前后对比):某金融系统调整buffer pool后,TPS从200提升到1500!
3.3 查询缓存要不要开?
(血泪教训):MySQL8.0直接移除了查询缓存功能!老版本建议:
query_cache_type=0 # 直接关闭
四、高级优化技巧(P7级别加分项)
4.1 分页查询优化
传统写法:
SELECT * FROM orders LIMIT 1000000,10; -- 慢到怀疑人生
优化方案:
SELECT * FROM orders
WHERE id > 1000000
ORDER BY id
LIMIT 10; -- 速度飞起
4.2 大批量数据导入
(千万级数据导入实战):
- 关闭自动提交
- 禁用索引(导入完成再重建)
- 使用LOAD DATA INFILE代替INSERT
- 合理设置innodb_flush_log_at_trx_commit
4.3 冷热数据分离方案
(某社交平台实战案例):
- 热数据:最近3个月动态 → InnoDB存储
- 冷数据:历史存档数据 → Archive存储
- 归档策略:每天凌晨定时任务迁移
五、高频面试题破解指南
Q1:为什么用B+树不用B树?
(标准答案+加分项):
- B+树非叶子节点不存数据 → 更矮的树结构
- 叶子节点形成链表 → 适合范围查询
- (进阶)磁盘预读特性更友好
Q2:如何优化深分页问题?
(三步走回答法):
- 先用子查询定位ID
- 再用主键索引快速定位
- 配合业务设计优化方案
Q3:线上出现慢查询怎么办?
(故障排查SOP):
- 紧急预案:kill慢查询进程
- 分析原因:explain+show profile
- 优化方案:索引/SQL改写/参数调优
- 预防措施:上线SQL审核流程
六、真实调优案例:电商大促系统优化记
背景:某电商平台大促期间数据库CPU飙升至90%
优化步骤:
- 慢查询分析:发现10条高频慢SQL
- 索引优化:新增3个覆盖索引
- 架构调整:读写分离+缓存层
- 参数调优:调整InnoDB配置
- 效果:CPU降至30%,QPS提升5倍
(关键指标对比表):
指标 | 优化前 | 优化后 |
---|---|---|
平均响应时间 | 800ms | 150ms |
最大连接数 | 2000 | 800 |
TPS | 1200 | 6500 |
七、防坑指南:新手常犯的5个错误
- 索引建得越多越好 → 错!每个索引都会降低写性能
- 所有字段都选NOT NULL → 对!NULL值会导致索引复杂度增加
- 使用SELECT * → 大忌!务必指定所需字段
- 事务自动提交开着跑批 → 性能杀手!记得关闭autocommit
- 用存储过程处理复杂逻辑 → 小心变成性能瓶颈!
八、学习路线推荐(6周速成计划)
第一周:MySQL基础+索引原理
第二周:EXPLAIN详解+慢查询分析
第三周:参数调优+架构设计
第四周:分库分表实战
第五周:生产环境故障排查
第六周:分布式事务解决方案
(学习资源推荐):
- 《高性能MySQL》必读圣经
- Percona官方博客(实时更新优化技巧)
- 阿里云数据库最佳实践白皮书
九、最后的大招:面试模拟实战
面试官:你说你做过SQL优化,举个例子?
标准回答模板:
- 问题场景:某核心接口响应慢
- 分析过程:通过慢日志定位到问题SQL
- 优化方案:添加组合索引+改写SQL
- 结果验证:响应时间从2s降到200ms
- 后续措施:建立SQL审核规范
(加分项):拿出手机展示当时保存的EXPLAIN结果截图!
记住:优化永无止境,但掌握了这些核心心法,你已经超过了80%的候选人!下次面试遇到MySQL优化问题,记得露出自信的微笑~