Skip to content

MySQL 调优 Cheatsheet(按层级划分)

一、连接层(客户端侧 + 连接池)

常见场景:连接太多挂死、连接泄漏、断链

  • max_connections:最大允许连接数
  • wait_timeout / interactive_timeout:连接闲多久断
  • 客户端连接池调优(详见你刚学的那套)

二、SQL 层(语句级别)

性能瓶颈最常见的地方

  • 慢查询优化
    • 打开 slow_query_log
    • 分析 EXPLAINSHOW PROFILESHOW 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监控、慢盘告警