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;
总结
开启三步:
SET GLOBAL slow_query_log = ONSET GLOBAL long_query_time = 2- 看日志:
mysqldumpslow -s t -t 10 slow.log
记住: 慢查询日志是优化数据库的第一步,先找到慢SQL再优化。
遇到问题加QQ23979811 协助处理
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
总结
三步开启慢查询:
- 开
slow_query_log - 设
long_query_time - 用
mysqldumpslow分析
记住: 慢查询日志是优化数据库的第一步,先开了再说。
遇到问题加QQ23979811 协助处理