一、索引优化:数据库的任督二脉(必考!)
各位老铁注意了!索引优化是调优的入门必修课,但90%的开发者都没搞明白这三个致命误区:
- 索引不是越多越好(血泪教训)
- 场景:用户表有10个索引,写入性能暴跌
- 诊断:每个insert都要维护10棵B+树
- 解决:删除重复索引,合并组合索引
- 最左前缀原则的隐藏陷阱
-- 错误示范(name_age索引)
SELECT * FROM users WHERE age=25; -- 索引失效!
-- 正确姿势
SELECT * FROM users WHERE name='老王' AND age=25;
- 索引选择性决定生死
- 性别字段建索引?不如裸奔!(选择性低于30%的字段慎用)
- 实战案例:给手机号字段加索引,查询速度提升200倍!
二、查询优化:SQL语句的整容手术
2.1 EXPLAIN执行计划全解(面试必问!)

(图示:重点关注type列,ALL全表扫描直接枪毙)
2.2 十大作死写法黑名单
SELECT *(传输数据量爆炸)WHERE 1=1(破坏查询缓存)LIKE '%xxx%'(索引失效警告)- 隐式类型转换(字符串当数字用)
- 滥用子查询(改用JOIN效率提升10倍案例)
2.3 高级优化技巧
-- 原SQL(执行时间3.2秒)
SELECT * FROM orders
WHERE YEAR(create_time)=2023
AND status=1;
-- 优化后(0.15秒!!)
SELECT * FROM orders
WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31 23:59:59'
AND status=1;
(关键点:避免对字段使用函数)
三、配置优化:服务器参数的秘密花园
3.1 内存分配的黄金比例
# my.cnf核心配置
innodb_buffer_pool_size = 物理内存的70%
key_buffer_size = 64M
query_cache_size = 0 # MySQL8.0已废弃!
3.2 连接数控制的艺术
-- 查看当前连接风暴
SHOW STATUS LIKE 'Threads_connected';
-- 救命配置
max_connections=1000
wait_timeout=60
四、架构优化:分布式时代的生存法则
4.1 读写分离实战

(图示:一主三从架构,配合MyCat中间件)
4.2 分库分表的三重境界
- 水平拆分:按用户ID取模
- 垂直拆分:把用户画像单独分库
- 时间分片:历史订单归档
五、锁机制:并发控制的修罗场
5.1 死锁排查七步法
SHOW ENGINE INNODB STATUS- 分析LATEST DETECTED DEADLOCK
- 查看等待锁的线程
- 检查事务隔离级别
- 审查SQL执行顺序
- 添加合理的索引
- 重试机制保平安
六、慢查询日志:DBA的照妖镜
6.1 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
6.2 日志分析神器
mysqldumpslow -t 10 /var/log/mysql/slow.log
pt-query-digest /var/log/mysql/slow.log
七、终极武器:压测调优法
7.1 sysbench压力测试
sysbench oltp_read_write
--mysql-host=127.0.0.1
--mysql-user=root
--tables=10
--table-size=1000000 prepare
7.2 监控指标四天王
- QPS(每秒查询量)
- TPS(每秒事务数)
- 连接数波动
- CPU/内存使用率
八、避坑指南:新手必犯的七个错误
- 在循环里执行SQL(N+1查询问题)
- 事务不提交导致锁表
- 忘记打开慢查询日志
- 盲目相信ORM生成的SQL
- 忽视字符集导致的隐式转换
- 没有定期执行
OPTIMIZE TABLE - 从不查看MySQL错误日志
九、性能调优的哲学思考(升华时刻)
调优的本质是平衡的艺术:在空间换时间、吞吐量与延迟、一致性与可用性之间寻找动态平衡点。记住这三个终极口诀:
- 能加缓存的不改SQL
- 能改SQL的不动架构
- 能调参数的不改代码
最后送大家一句调优箴言:过早优化是万恶之源,没有监控的优化就是耍流氓! 调优要有数据支撑,靠猜调优只会越调越糟。祝各位在调优路上早日修成正果,成为真正的数据库调优仙人!
459

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



