MySQL查看慢查询日志,long_query_time参数

前言

网站突然变慢,不知道哪条SQL拖后腿。开慢查询日志,把跑得慢的SQL都抓出来优化。

一、什么是慢查询日志

慢查询日志(slow query log)记录执行时间超过阈值的SQL语句。

作用: 找到慢SQL,优化它们。

二、查看是否开启

SHOW VARIABLES LIKE 'slow_query_log';
Variable_name Value
slow_query_log OFF

OFF就是没开。

三、开启慢查询日志

方法1:临时开启(重启失效)

-- 开启
SET GLOBAL slow_query_log = ON;

-- 设置阈值(超过2秒算慢)
SET GLOBAL long_query_time = 2;

方法2:永久开启

改my.cnf:

[mysqld]
# 开启慢查询
slow_query_log = 1

# 慢查询阈值(秒)
long_query_time = 2

# 慢查询日志文件位置
slow_query_log_file = /var/log/mysql/slow.log

# 没走索引的SQL也记下来(可选)
log_queries_not_using_indexes = 1

重启MySQL:

systemctl restart mysqld

四、查看慢查询日志

直接看文件

tail -f /var/log/mysql/slow.log

用mysqldumpslow分析

MySQL自带的分析工具:

# 按查询时间排序,取前10
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

常用参数:

参数 说明
-s t 按时间排序
-s c 按次数排序
-s l 按锁时间排序
-t 10 取前10条
-g 过滤关键词

示例:

# 按次数最多的排
mysqldumpslow -s c -t 20 /var/log/mysql/slow.log

# 只看select语句
mysqldumpslow -g "select" /var/log/mysql/slow.log

五、用pt-query-digest分析

更专业的分析工具(需要安装):

pt-query-digest /var/log/mysql/slow.log

输出更详细的统计报告。

六、常用参数说明

参数 默认值 说明
slow_query_log OFF 是否开启
long_query_time 10 慢查询阈值(秒)
slow_query_log_file 主机名-slow.log 日志文件位置
log_queries_not_using_indexes OFF 没走索引的也记
log_output FILE 日志输出方式(FILE/TABLE)

七、优化慢SQL

找到慢SQL后怎么优化:

1. 加索引

EXPLAIN SELECT * FROM users WHERE name = '张三';

看type是不是ALL,是ALL说明没走索引。

2. 避免select *

只查需要的字段:

-- 别这样
SELECT * FROM users;

-- 这样
SELECT id, name FROM users;

3. 避免大表全表扫描

加where条件,加limit。

4. 优化分页

大表分页越查越慢,用游标分页。

常见坑

坑1:long_query_time设太小

设成0.1秒,日志文件爆炸,全是慢SQL。

建议: 生产环境设1-2秒。

坑2:日志文件越来越大

慢查询日志一直写,磁盘满了。

解决: 用logrotate切割日志。

坑3:开启慢查询影响性能

开慢查询本身有性能损耗。

解决: 排查完就关掉,或者用低采样率。

坑4:long_query_time不生效

改了参数,但还是记录所有SQL。

原因: 连接没断开,用的还是旧参数。

解决: 重新连接MySQL。

坑5:log_output=TABLE占满系统表

把慢查询写到mysql.slow_log表,表越来越大。

解决: 定期清理:

TRUNCATE TABLE mysql.slow_log;

总结

开启三步:

  1. SET GLOBAL slow_query_log = ON
  2. SET GLOBAL long_query_time = 2
  3. 看日志:mysqldumpslow -s t -t 10 slow.log

记住: 慢查询日志是优化数据库的第一步,先找到慢SQL再优化。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-8 07:55