Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql调优思路

MySQL 调优的实战思路

作者:CodeAmaz

文章总结了MySQL调优的过程,包括从确认问题到解决的步骤,首先,需要度量问题,然后从SQL、索引、配置和系统等方面进行排查和优化,文章强调了SQL和索引的重要性,并提供了具体的优化方法,最后,文章提供了一个实战调优流程,以及一些监控和排查工具清单,感兴趣的朋友一起看看吧

我是怎么做 MySQL 调优的(实战思路)

这不是“某几个参数调一调”的问题,而是一整套从 架构 → SQL → 索引 → 配置 → 系统 的排查流程。
你可以把这篇当成自己的 MySQL 调优 Checklist。

一、调优前的共识:先度量,再优化

调优最怕两件事:

  1. 拍脑袋调参数:改了一堆配置,QPS 没上去,反而更慢;
  2. 只盯一个点:只会改 innodb_buffer_pool_size,其他全靠缘分。

所以第一步永远是:

原则:先找到“最痛的那块”,再下手。

二、第一刀:从 SQL 入手(慢查询 & 执行计划)

绝大多数 MySQL 性能问题,都可以归结为:SQL 写得不行 + 索引没设计好

2.1 开启慢查询日志

SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1;   -- 超过 1 秒的算慢查询
SET GLOBAL log_queries_not_using_indexes = 1;  -- 也可以先开一阵

然后看:

SHOW VARIABLES LIKE 'slow_query_log%';
SHOW VARIABLES LIKE 'long_query_time';

线下或运维平台中,可以用工具分析 slow log:

2.2 对慢 SQL 用 EXPLAIN 做执行计划分析

EXPLAIN SELECT ...;

重点看:

2.3 改写 SQL + 补索引

-- ❌ 错误示例:索引容易失效
WHERE DATE(create_time) = '2025-01-01';
-- ✅ 正确示例:使用范围
WHERE create_time >= '2025-01-01 00:00:00'
  AND create_time <  '2025-01-02 00:00:00';

优先使用 联合索引 + 最左前缀

-- 经常这么查
WHERE user_id = ? AND status = ? AND create_time > ?;
-- 就建一个
CREATE INDEX idx_user_status_time ON t_order(user_id, status, create_time);

实战经验:先搞定 Top N 慢 SQL,系统性能往往就上一个台阶。

三、第二刀:索引与表结构设计

3.1 索引设计思路

  1. 区分“高频查询条件”和“偶尔查查”;
  2. 给经常出现在 WHERE / JOIN / ORDER BY / GROUP BY 的列设计索引;
  3. 尽量用 联合索引代替多个单列索引
  4. 注意索引列的选择性(区分度):
    • 性别、是否删除(0/1)这类字段不要单独建索引
    • 可以放在联合索引里。

3.2 合理选择主键与存储引擎

InnoDB:

表结构方面:

四、第三刀:InnoDB 关键参数调优

在 SQL & 索引搞定后,如果数据库仍吃紧,可以看配置。

4.1 innodb_buffer_pool_size(最关键的内存参数)

innodb_buffer_pool_size = 8G   # 视机器内存而定

4.2 innodb_log_file_size / log_buffer_size

innodb_log_file_size = 1G
innodb_log_buffer_size = 64M

4.3 innodb_flush_log_at_trx_commit

控制事务提交时 redo log 的刷盘策略:

业务取舍:

4.4 连接数相关

max_connections
thread_cache_size
wait_timeout
interactive_timeout

五、第四刀:操作系统 & 硬件层面

当你确认:

此时数据库仍然吃紧,就要看系统层面。

5.1 磁盘 IO

5.2 CPU

5.3 网络

六、第五刀:架构级优化(分库分表 & 读写分离)

当单实例再怎么调也扛不住时,就是架构层面问题了。

6.1 读写分离

典型做法:

适合场景:

6.2 分库分表

如果单表行数上亿,索引高度、统计信息、缓存命中都会出问题。

常见拆分维度:

拆分后要注意:

七、监控与排查工具清单

调优离不开“观察工具”:

  1. 慢查询日志:慢 SQL 排查入口;
  2. EXPLAIN / EXPLAIN ANALYZE:看执行计划、实际耗时;
  3. SHOW PROCESSLIST:看当前连接、是否有锁等待;
  4. SHOW ENGINE INNODB STATUS\G:看死锁、事务等待;
  5. information_schema / performance_schema / sys 库:
    • 统计哪些 SQL 最耗费资源。
  6. 操作系统工具:topiostatvmstatsar 等。

八、一套实战调优流程(总结版)

给你一套可直接复用的步骤:

九、小结

MySQL 调优本质上是一个“找瓶颈 → 定位层级 → 有针对性优化”的过程:

  1. SQL 与索引永远是第一优先级;
  2. InnoDB 参数是在“SQL/索引合理之后”的加分项;
  3. 再往上,是硬件和架构层面的扩展。

一句话:

不要指望靠改几个参数就“神奇提速”,调优一定是数据驱动 + 全链路思考
养成“看慢日志 + EXPLAIN + 监控”的习惯,你的 MySQL 水平会非常快地上来。

到此这篇关于MySQL 调优的实战思路的文章就介绍到这了,更多相关mysql调优思路内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文