Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL慢查询日志定位低效SQL

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

作者:·云扬·

在 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

参数说明:

3. 第三方工具推荐(进阶)

pt-query-digest /data/mysql/log/mysql-slow.log > slow_analysis.report

三、慢查询优化实操案例

案例 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;

四、慢查询日志使用注意事项

控制日志大小

生产环境谨慎启用 “未使用索引日志”

结合 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的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文