当前位置: 代码网 > it编程>数据库>Mysql > MySQL使用慢查询日志Slow Log定位低效SQL的全过程

MySQL使用慢查询日志Slow Log定位低效SQL的全过程

2026年02月13日 Mysql 我要评论
在 mysql 数据库运维中,sql 语句的执行效率直接影响系统响应速度。当网站出现卡顿、接口超时等问题时,慢查询日志(slow log) 往往是定位低效 sql 的 “第一手证据&rdq

在 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. 直接查看日志文件

慢查询日志为文本格式,可通过 cattail 等命令直接查看:

# 查看最新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 并进行优化。核心步骤可概括为:

  1. 启用慢查询日志,设置合理阈值
  2. 利用工具分析日志,锁定高频 / 耗时 sql
  3. 通过添加索引、优化 sql 语句等方式解决瓶颈
  4. 持续监控日志,预防性能问题复发

掌握慢查询日志的使用,能让数据库运维从 “被动排查” 转向 “主动优化”,为系统稳定性保驾护航。

以上就是mysql使用慢查询日志slow log定位低效sql的全过程的详细内容,更多关于mysql慢查询日志定位低效sql的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com