MySQL使用慢查询日志Slow Log定位低效SQL的全过程
在 MySQL 数据库运维中,SQL 语句的执行效率直接影响系统响应速度。当网站出现卡顿、接口超时等问题时,慢查询日志(Slow Log) 往往是定位低效 SQL 的 “第一手证据”。它能记录所有执行时间超过阈值的 SQL 语句,帮助我们精准锁定性能瓶颈 —— 无论是全表扫描、索引缺失,还是 JOIN 逻辑不合理,都能通过慢查询日志一探究竟。
一、慢查询日志基础配置
1. 查看当前慢查询状态
首先通过 MySQL 命令行查看默认配置,确认慢查询日志是否启用:
-- 查看慢查询日志启用状态(ON/OFF) show variables like 'slow_query_log'; -- 查看慢查询阈值(单位:秒,默认10秒) show variables like 'long_query_time'; -- 查看慢查询日志存储路径 show variables like 'slow_query_log_file';

2. 临时启用慢查询日志(重启失效)
适合临时排查问题,无需重启 MySQL 服务:
-- 启用慢查询日志 set global slow_query_log = 'ON'; -- 设置日志存储路径 set global slow_query_log_file = '/data/mysql/log/mysql-slow.log'; -- 设置阈值为 1 秒(执行时间≥1秒的SQL会被记录) set global long_query_time = 1; -- 记录未使用索引的SQL(可选,谨慎启用,可能产生大量日志) set global log_queries_not_using_indexes = 'ON';
3. 永久启用慢查询日志(推荐)
修改 MySQL 配置文件(my.cnf 或 my.ini),重启后生效:
# 1. 编辑配置文件 vim /data/mysql/conf/my.cnf # 2. 添加配置 [mysqld] # 启用慢查询日志 slow_query_log = 1 # 日志文件路径(建议放在非系统盘,避免占用系统空间) slow_query_log_file = /data/mysql/log/mysql-slow.log # 慢查询阈值(建议生产环境设为 1-3 秒) long_query_time = 1 # 记录未使用索引的SQL(按需启用) log_queries_not_using_indexes = 1 # 记录管理语句(如 ALTER TABLE,可选) log_slow_admin_statements = 1 # 3. 重启 MySQL 服务 /etc/init.d/mysql.server restart
二、慢查询日志分析方法
1. 直接查看日志文件
慢查询日志为文本格式,可通过 cat、tail 等命令直接查看:
# 查看最新10条慢查询 tail -n 10 /data/mysql/log/mysql-slow.log # 搜索包含特定表的慢查询 grep 'user_info' /data/mysql/log/mysql-slow.log
日志格式解析(关键字段):
# Time: 2026-02-04T02:37:11.367549Z # 执行时间 # User@Host: root[root] @ localhost [] Id: 11 # 执行用户与主机 # Query_time: 2.011508 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1 # 耗时、锁时间、返回行数、检查行数 SET timestamp=1770172629; # 时间戳 select sleep(2); # 具体 SQL
Query_time:SQL 执行时间(秒)
Lock_time:锁等待时间(秒)
Rows_sent:返回结果行数
Rows_examined:扫描的行数(数值越大越可能存在优化空间)
2. 使用 mysqldumpslow 工具分析
MySQL 自带的日志分析工具,可统计慢查询的频率、平均执行时间等:
# 统计执行次数最多的前10条慢查询 mysqldumpslow -s c -t 10 /data/mysql/log/mysql-slow.log # 统计平均执行时间最长的前10条慢查询 mysqldumpslow -s t -t 10 /data/mysql/log/mysql-slow.log # 筛选包含 JOIN 的慢查询 mysqldumpslow -g 'JOIN' /data/mysql/log/mysql-slow.log



参数说明:
-s:排序方式(c = 执行次数,t = 执行时间,l = 锁定时间,r = 返回行数)-t:显示条数-g:正则匹配筛选
3. 第三方工具推荐(进阶)
- pt-query-digest(Percona Toolkit):功能强大,支持按 SQL 模板分组、统计百分比,生成详细分析报告
pt-query-digest /data/mysql/log/mysql-slow.log > slow_analysis.report
- MySQL Workbench:可视化工具,可通过 “Performance” 模块导入慢查询日志,生成图表化分析结果
三、慢查询优化实操案例
案例 1:未使用索引导致全表扫描
慢查询日志中发现:
Query_time: 4.5 Rows_examined: 50000 Rows_sent: 10 SELECT * FROM order_info WHERE create_time >= '2024-01-01';
优化方案:为 create_time 字段添加索引
ALTER TABLE order_info ADD INDEX idx_create_time (create_time);
优化后效果:Query_time 降至 0.01 秒,Rows_examined 变为 10。
案例 2:JOIN 语句缺少关联索引
慢查询日志中发现:
Query_time: 6.8 Rows_examined: 100000 SELECT u.name, o.order_no FROM user u JOIN order o ON u.id = o.user_id WHERE o.status = 1;
优化方案:为关联字段 o.user_id 添加索引
ALTER TABLE order ADD INDEX idx_user_id (user_id);
案例 3:SELECT * 导致无用字段扫描
慢查询日志中发现:
Query_time: 3.1 Rows_examined: 8000 SELECT * FROM product WHERE category_id = 10;
优化方案:只查询需要的字段,避免全字段扫描
SELECT id, name, price FROM product WHERE category_id = 10;
四、慢查询日志使用注意事项
控制日志大小:
- 避免将
long_query_time设置过小(如 ),否则会产生大量日志,占用磁盘空间并影响性能 - 定期轮转日志(可通过
logrotate工具或 MySQL 自带的FLUSH LOGS命令)
生产环境谨慎启用 “未使用索引日志”:
log_queries_not_using_indexes = 1会记录所有未使用索引的 SQL,即使执行时间很短,可能导致日志膨胀- 建议仅在排查特定问题时临时启用
结合 EXPLAIN 分析 SQL:
对于慢查询日志中的 SQL,使用 EXPLAIN 查看执行计划,明确优化方向:
EXPLAIN SELECT * FROM user_info WHERE age > 30;
重点关注 type(访问类型,如 ALL = 全表扫描、ref = 索引查找)、key(使用的索引)、rows(预计扫描行数)字段。
总结
慢查询日志是 MySQL 性能优化的 “利器”,通过合理配置和高效分析,能快速定位低效 SQL 并进行优化。核心步骤可概括为:
- 启用慢查询日志,设置合理阈值
- 利用工具分析日志,锁定高频 / 耗时 SQL
- 通过添加索引、优化 SQL 语句等方式解决瓶颈
- 持续监控日志,预防性能问题复发
掌握慢查询日志的使用,能让数据库运维从 “被动排查” 转向 “主动优化”,为系统稳定性保驾护航。
以上就是MySQL使用慢查询日志Slow Log定位低效SQL的全过程的详细内容,更多关于MySQL慢查询日志定位低效SQL的资料请关注脚本之家其它相关文章!


最新评论