MySQL慢查询优化是保障系统稳定与接口性能的关键工作。当业务请求变慢时,往往需要先确认是否是数据库查询耗时过长,再按流程逐步定位和改进。

一、开启并定位慢查询
第一步是确认慢查询日志是否开启,并设定合理阈值。通过以下命令可查看当前配置:
-- 查看慢查询相关变量 SHOW VARIABLES LIKE 'slow_query_log'; SHOW VARIABLES LIKE 'long_query_time';
若未开启,可在配置文件中设置或动态开启:
-- 动态开启慢日志,阈值设为1秒 SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1;
定位到具体SQL后,使用EXPLAIN分析执行计划,重点看type、key、rows和Extra字段。
二、分析执行计划
对可疑语句执行EXPLAIN:
EXPLAIN SELECT id, name FROM user WHERE age > 30 ORDER BY create_time DESC LIMIT 100;
- type为ALL表示全表扫描,需要考虑加索引
- key为NULL说明未使用索引
- Extra出现Using filesort或Using temporary需优化排序与分组
三、索引优化与SQL改写
根据执行计划建立联合索引,避免冗余列:
-- 为查询条件与排序建立联合索引 CREATE INDEX idx_age_ctime ON user(age, create_time);
深分页场景可改为基于上一页最大ID的游标查询:
-- 避免使用大offset SELECT id, name FROM user WHERE age > 30 AND id < 10000 ORDER BY id DESC LIMIT 20;
四、参数与结构改进
适当增大innodb_buffer_pool_size可提升缓存命中。对大表可考虑分库分表或归档冷数据。锁等待问题可通过缩短事务、调整隔离级别缓解。
| 步骤 | 动作 | 目标 |
|---|---|---|
| 定位 | 慢日志+EXPLAIN | 找到问题SQL |
| 改进 | 加索引/改写法 | 减少扫描行数 |
| 巩固 | 调参/拆表 | 长期稳定 |
五、验证与监控
优化后应在测试环境用真实数据验证耗时,并持续监控慢日志,防止回归。整个流程核心是先度量再改动,避免凭直觉调参。