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 

MySQL慢查询开启,定位慢SQL语句方法

前言

网站越来越慢,不知道哪条 SQL 拖后腿。MySQL 自带慢查询日志功能,能把执行慢的 SQL 记录下来,方便优化。

什么是慢查询

就是执行时间超过某个阈值的 SQL 语句。默认阈值是 10 秒,太久了,一般改成 1 秒或者 2 秒。

临时开启(重启不丢)

登录 MySQL:

mysql -u root -p

开启慢查询:

-- 开启慢查询
SET GLOBAL slow_query_log = ON;

-- 设置超过1秒就记录
SET GLOBAL long_query_time = 1;

-- 查看慢查询日志位置
SHOW VARIABLES LIKE 'slow_query_log_file';

永久开启(改配置文件)

改 my.cnf:

vi /etc/my.cnf

加上:

slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1

重启 MySQL:

systemctl restart mysqld

慢查询日志长什么样

# Time: 2026-10-07T07:00:00.000000Z
# User@Host: root[root] @ localhost []  Id:  1234
# Query_time: 5.234567  Lock_time: 0.000123 Rows_sent: 1000  Rows_examined: 1000000
SET timestamp=1728270000;
SELECT * FROM users WHERE name LIKE '%张%';

重点看:

  • Query_time:执行时间
  • Rows_examined:扫描了多少行
  • 最后一行就是慢 SQL 语句

分析慢查询日志

用 mysqldumpslow 工具:

# 找出最慢的10条SQL
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

# 找出返回数据最多的10条
mysqldumpslow -s r -t 10 /var/log/mysql/slow.log

参数说明:

参数 说明
-s t 按时间排序
-s r 按返回行数排序
-t 10 显示前10条

常见坑

坑1:没开启慢查询

不知道怎么开,或者开了忘了。

解决: 用 SHOW VARIABLES LIKE 'slow_query_log'; 确认一下。

坑2:阈值设太大

默认是 10 秒,10 秒以下的慢 SQL 都没记录到。

解决: 改成 1 秒,够用了。

坑3:日志太大占磁盘

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

解决: 配 logrotate 定期切割。

坑4:没记录没走索引的SQL

有些 SQL 虽然快,但没走索引,数据量一大就慢了。

解决: 加上这个参数,没走索引的也记录:

log_queries_not_using_indexes = 1

总结

三步开启慢查询:

  1. 开 slow_query_log
  2. 设 long_query_time
  3. 用 mysqldumpslow 分析

记住: 慢查询日志是优化数据库的第一步,先开了再说。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-7 07:53 
'); })();