Appearance
MySQL 调优 Cheatsheet(按层级划分)
一、连接层(客户端侧 + 连接池)
常见场景:连接太多挂死、连接泄漏、断链
max_connections:最大允许连接数wait_timeout/interactive_timeout:连接闲多久断- 客户端连接池调优(详见你刚学的那套)
二、SQL 层(语句级别)
性能瓶颈最常见的地方
- ✅ 慢查询优化:
- 打开
slow_query_log - 分析
EXPLAIN、SHOW PROFILE、SHOW WARNINGS
- 打开
- ✅ 避免全表扫描:确认
WHERE语句命中索引 - ✅ 合理使用索引:覆盖索引、联合索引、前缀索引
- ❌
SELECT *,❌ 不走索引的模糊查询 - 分页优化:大表分页用 ID > ? LIMIT ? 替代 offset 大跳页
三、缓存层(内存参数)
缓存配置不对,系统再快都白搭
query_cache_size(已弃用,但老版本还有)innodb_buffer_pool_size:核心参数!推荐占总内存 60~80%key_buffer_size:MyISAM 表才用table_open_cache:控制打开表的缓存数
四、InnoDB 存储层(磁盘 IO)
真正性能瓶颈是落盘速度,InnoDB 参数大有门道
innodb_flush_log_at_trx_commit:设置为 2(性能更优)innodb_log_file_size:单个 redo log 文件大小,适配业务高写入innodb_io_capacity:磁盘 IOPS 上限提示值(SSD 推荐 1000+)innodb_read_io_threads/write_io_threads:并发 IO 线程数
五、系统层(OS + 硬件)
跑得快慢,底层资源是根本
ulimit -n文件描述符上限(连接多了不调这个直接炸)- 使用 SSD 替代机械硬盘(IOPS 提升一个数量级)
- Linux 内核参数如
vm.swappiness,dirty_ratio等配合 MySQL 调优 - numa bind 绑定 CPU & 内存避免跨 NUMA 访问延迟
六、监控 + 自动化优化
不监控你都不知道哪慢
- 接入 Prometheus + Grafana,观察:
- QPS、TPS
- 慢查询比
- Buffer pool 命中率
- Handler_read 系列指标(表明是否走索引)
- 自动化工具推荐:
pt-query-digest:分析慢查询MySQLTuner:一键诊断配置sys schema:官方优化视图
MySQL 各层调优 & 验证
一张图看懂:MySQL 各层调优 & 验证
sh
├── 应用层(ORM/SQL)
│ ├── 调优:避免 N+1、参数化、分批查、LIMIT+WHERE
│ └── 验证:SQL日志慢查、应用RT波动分析
│
├── SQL 层(语法/执行计划)
│ ├── 调优:改写SQL、索引hint、JOIN顺序、避免函数索引失效
│ └── 验证:EXPLAIN、SHOW WARNINGS、执行时间对比
│
├── 优化器层(执行路径)
│ ├── 调优:ANALYZE TABLE、统计信息更新、force index
│ └── 验证:执行计划是否命中最优路径、rows估算是否准
│
├── 存储引擎层(InnoDB)
│ ├── 调优:页大小、Buffer Pool、Redo Log 策略
│ └── 验证:InnoDB Monitor、Handler counters、脏页比例
│
├── 连接层 / 线程池
│ ├── 调优:Max Connections、线程池调度、连接池设置
│ └── 验证:连接数/CPU占用/Wait状态分布(SHOW PROCESSLIST)
│
├── 操作系统层
│ ├── 调优:文件句柄、swap禁用、内核参数(如 open_files_limit)
│ └── 验证:iostat、top、vmstat、NUMA策略
│
└── 硬件IO层
├── 调优:SSD替换HDD、RAID优化、IO调度策略
└── 验证:fio压测、磁盘IOPS监控、慢盘告警