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

 更新时间:2026年02月13日 09:29:17   作者:·云扬·  
在 MySQL 数据库运维中,SQL 语句的执行效率直接影响系统响应速度,当网站出现卡顿、接口超时等问题时,慢查询日志(Slow Log) 往往是定位低效SQL的第一手证据,本文给大家介绍了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. 直接查看日志文件

慢查询日志为文本格式,可通过 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的资料请关注脚本之家其它相关文章!

相关文章

  • 详解MySQL性能优化(二)

    详解MySQL性能优化(二)

    本文对MySQL性能优化进行了详细的总结与介绍,需要的朋友可以参考下
    2015-08-08
  • mysql出现提示错误10061的解决方法

    mysql出现提示错误10061的解决方法

    这篇文章主要为大家详细介绍了mysql出现提示错误10061的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • dbeaver如何导出mysql数据库

    dbeaver如何导出mysql数据库

    DBeaver导出MySQL数据库的简便方法:右键点击表选择“Tools”->“Dump database”,设定输出文件夹(例如桌面),点击开始即可导出SQL文件,此方法基于个人经验,供参考
    2024-10-10
  • mysql中使用UDF自动同步memcached效率笔记

    mysql中使用UDF自动同步memcached效率笔记

    接上篇:mysql使用mysql-udf-http效率测试笔记 ,这次不使用rest架构,而是使用:libmemcached和memcached_functions_mysql
    2011-08-08
  • 一键安装mysql5.7及密码策略修改方法

    一键安装mysql5.7及密码策略修改方法

    这篇文章主要介绍了一键安装mysql5.7及密码策略修改方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • MySQL触发器trigger的使用

    MySQL触发器trigger的使用

    这篇文章主要介绍了MySQL触发器trigger的使用,触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • mysqldump造成Buffer Pool污染的研究

    mysqldump造成Buffer Pool污染的研究

    mysqldump造成Buffer Pool污染的研究,需要的朋友可以参考下
    2012-10-10
  • 详解MySQL多表查询

    详解MySQL多表查询

    最近学习了多表查询,这篇文章主要给大家介绍了关于MySQL多表查询,文中通过实例代码介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-04-04
  • mysql 添加索引 mysql 如何创建索引

    mysql 添加索引 mysql 如何创建索引

    本文将介绍mysql 如何创建索引,需要的朋友可以参考下
    2012-11-11
  • mysql 修改用户密码图文介绍

    mysql 修改用户密码图文介绍

    有许多朋友经常需要修改mysql修改用户密码,今天提供图文并茂来解决此类问题,需要的朋友可以参考下
    2012-11-11

最新评论