一、索引优化的三大禁忌与实战技巧(必看)
1.1 全表扫描的七宗罪
大家有没有见过执行计划里那个可怕的"ALL"字样?!!!这就是全表扫描的死亡标记!最近排查的某电商平台慢查询案例中,一个简单的用户订单查询竟然耗时8秒,原因就是WHERE条件中的手机号字段没加索引(血泪教训啊)
-- 错误示范
SELECT * FROM orders WHERE user_phone = '13812345678';
-- 正确姿势
ALTER TABLE orders ADD INDEX idx_phone(user_phone);
EXPLAIN SELECT * FROM orders WHERE user_phone = '13812345678';
执行计划对比:
- 优化前:type=ALL,rows=500万
- 优化后:type=ref,rows=1
1.2 复合索引的排列组合玄学
(超级重要)复合索引字段顺序就像玩魔方!某物流系统查询优化案例:
-- 查询场景
WHERE province='浙江' AND city='杭州'
ORDER BY create_time DESC
LIMIT 100
-- 错误索引
INDEX (province, create_time)
-- 正确索引
INDEX (province, city, create_time)
实测效果:
- 错误索引:Using filesort
- 正确索引:Using index condition + Backward index scan
二、查询语句优化的五个魔鬼细节
2.1 LIMIT分页的死亡陷阱
当遇到深度分页时,传统写法直接暴毙:
-- 危险写法(100万数据时)
SELECT * FROM table LIMIT 999990, 10;
-- 优化方案
SELECT * FROM table
WHERE id > (SELECT id FROM table ORDER BY id LIMIT 999990, 1)
LIMIT 10;
实测性能提升300倍!原理是利用覆盖索引快速定位
2.2 JOIN连接的三大军规
最近处理的社交平台好友关系查询案例:
-- 原始慢查询(执行时间12秒)
SELECT u.*, f.*
FROM users u
LEFT JOIN friends f ON u.id = f.user_id
WHERE u.age > 18
-- 优化方案(执行时间0.8秒)
SELECT u.*, f.*
FROM (SELECT id FROM users WHERE age > 18) u
STRAIGHT_JOIN friends f ON u.id = f.user_id
关键技巧:
- 用小表驱动大表(STRAIGHT_JOIN强制顺序)
- 子查询先过滤
- 确保关联字段有索引
三、配置调优的黄金参数(附生产环境配置)
3.1 InnoDB引擎的四大金刚
某金融系统配置优化前后对比:
| 参数 | 默认值 | 优化值 | 效果提升 |
|---|---|---|---|
| innodb_buffer_pool_size | 128M | 32G | 查询速度提升5倍 |
| innodb_log_file_size | 48M | 2G | TPS提升300% |
| innodb_flush_log_at_trx_commit | 1 | 2 | 写性能提升200% |
| innodb_thread_concurrency | 0 | 32 | 并发处理能力提升150% |
(注意:这些值要根据实际内存调整,别直接照搬!)
四、慢查询分析的杀手锏
4.1 慢查询日志的正确打开方式
配置秘籍(my.cnf):
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
log_throttle_queries_not_using_indexes = 10
配合pt-query-digest工具分析:
pt-query-digest /var/log/mysql/slow.log > slow_report.txt
五、架构层面的降维打击
5.1 读写分离的三种姿势
某在线教育平台实战方案:
- 基础版:MySQL主从 + 应用层分离
- 进阶版:ProxySQL中间件自动路由
- 终极版:ShardingSphere分库分表
读写比从10:1优化到100:1的奇迹!
六、监控体系的九阴真经
6.1 Prometheus+Granafa监控矩阵
必须监控的五大黄金指标:
- QPS/TPS波动曲线
- 连接数使用率(Threads_connected)
- 缓冲池命中率(Innodb_buffer_pool_reads)
- 锁等待时间(Innodb_row_lock_time_avg)
- 复制延迟(Seconds_Behind_Master)
七、面试必杀的七个灵魂拷问
最近辅导学员遇到的真实面试题:
-
“你说索引能优化查询,那为什么我们加了索引反而更慢了?”
- 答案:可能遇到索引失效、回表查询、索引维护成本等情况
-
“MySQL突然CPU飙到500%怎么快速定位问题?”
- 三板斧:show processlist、慢查询日志、explain分析
-
“线上大表如何在不锁表的情况下添加索引?”
- 必答pt-online-schema-change原理
最后送大家一个调优口诀(自己总结的):
一查执行计划,二看索引情况
三验SQL写法,四调配置参数
五析慢查询日志,六测架构方案
七建监控体系,八防于未然
调优不是玄学,而是科学实验!每个参数调整都要有数据支撑,每次优化都要有前后对比。记住:没有银弹,只有最适合的方案!
234

被折叠的 条评论
为什么被折叠?



