接手过不少MySQL实例,我最怕的不是慢,而是业务方跑过来扔一句"库有点慢,帮忙看看",然后甩给我一堆权限。慢是个太笼统的词,到底是查询慢、写入慢、还是连接都建不上?同一个问题,优化入口可以完全不同。你抓不住真正的瓶颈点,后面做再多调整都是白费力气。
MySQL全面优化这件事,说复杂也复杂,说简单也简单。只要路子对,它就是一个有固定套路的系统工程。我习惯把它拆成六个层面:排查准备、SQL语句、索引设计、参数配置、表结构、架构部署。每个层面都有明确的切入点和验证方式,而且它们之间是递进关系——SQL和索引往往是优先项,参数和架构解决的是更深层的容量问题。这篇文章我会把这六个方面完整过一遍,把每一步"为什么要这么做"和"具体怎么落地"都讲清楚。
1. 先搞清楚到底慢在哪:优化前的排查准备
很多人的优化是从改配置文件开始的,今天调大innodb_buffer_pool_size,明天调高max_connections,改完重启,看起来理直气壮。但实话说,不知道瓶颈在哪就乱调参数,基本等于闭着眼睛修车。优化之前,必须先把"慢"这个模糊概念量化,定位到具体环节。
1.1 打开慢查询日志,拿到第一手证据
MySQL的慢查询日志是你排查性能问题的第一现场。我见过太多生产环境开了十年库,从来没开过慢查询日志的,这真的不可思议。不打开它,你的优化就是盲人摸象。
sql复制-- 查看当前慢查询配置
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
-- 开启慢查询日志(动态生效,无需重启)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = 'ON';
这里有个细节:long_query_time设置的是"超过多少秒算慢",但注意它只统计执行时间,不统计锁等待时间。所以你在日志里看到一条SQL执行了3秒,它可能实际执行只需要0.1秒,剩下2.9秒都在等锁。判断的时候要结合SHOW ENGINE INNODB STATUS里的锁信息一起看,不能只看表面数字。
生产环境建议把long_query_time设为1秒,再结合pt-query-digest或mysqldumpslow定期分析。如果一条SQL频繁出现在Top N里,它必是你要优化的头号目标。
1.2 压测基线:没有对比就没有优化
光看慢查询日志还不够。我强烈建议在动手优化之前,用sysbench或mysqlslap跑一轮标准压测,把当前的QPS、TPS、响应时间P95记下来。有了基线数据,你后面每做一项调整,都能拿数据说话,而不是靠感觉判断"好像快了"。
bash复制# 以 sysbench 为例,先准备测试数据
sysbench --db-driver=mysql --mysql-host=127.0.0.1 --mysql-user=root \
--mysql-password=yourpass --mysql-db=testdb \
--table-size=1000000 --tables=8 \
/usr/share/sysbench/oltp_read_write.lua prepare
# 跑一轮压测
sysbench --db-driver=mysql --mysql-host=127.0.0.1 --mysql-user=root \
--mysql-password=yourpass --mysql-db=testdb \
--threads=16 --time=60 --report-interval=5 \
/usr/share/sysbench/oltp_read_write.lua run
记录结果时,别只记平均值,latency avg、95th percentile和max都要记。平均值会被少数极快请求拉低,P95才是真实用户体验的反映。这个基线数据会成为你后续所有优化决策的参照系。优化完之后,跑同样的压测,对比两个数据的差异,效果好与不好,一清二楚。
1.3 一个务必内化的排查链路
我自己在接到任何性能问题时,都会走一套固定链条,这套路适合所有人参考:
- 看慢查询日志,找出耗时最高的那批SQL;
SHOW FULL PROCESSLIST查看当前正在执行的会话,留意有没有大量Waiting for table metadata lock或Updating状态的线程;- 对可疑SQL执行
EXPLAIN看执行计划,确认是全表扫描、临时文件排序还是索引失效; - 确认硬件资源,
top看CPU负载,iostat看磁盘I/O,vmstat看上下文切换; - 最后才是看参数配置是否合理。
这五步走完,问题大概在哪一层基本就有数了。如果你跳过前四步直接到第五步,大概率是浪费时间——因为很多慢查询问题根本不是参数造成的,SQL本身写得烂,参数再优化也白搭。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. SQL语句改写:成本最低见效最快的突破口
拿到慢查询日志后,优先关注那些频繁出现、执行时间又长的SQL。改写SQL是性价比最高的优化手段,不需要动任何数据库结构,有时候一行语句的改动,性能差距能达到几百倍。
