位置:首页 > SQL > MySQL慢查询日志详解与配置优化指南

MySQL慢查询日志详解与配置优化指南

时间:2026-08-16  |  作者:星际追番人  |  阅读:0

慢查询日志,顾名思义,就是专门记录那些在 MySQL 里执行时间超过设定阈值的查询语句。

借助这份日志,很容易把执行效率偏低的 SQL 找出来,后续优化也就有了明确抓手。

说得更直白一点,MySQL 的慢查询日志既是排查 SQL 问题的重要依据,也是观察当前 MySQL 性能状态的一个关键功能。

不过也要注意,如果当前并没有调优需求,通常不建议一直开启这个参数。原因很简单:慢查询日志一旦开启,多少都会带来一定的性能开销。

默认情况下,慢查询日志是关闭的。是否已经开启,可以通过下面的命令查看。命令和执行过程如下:

mysql> SHOW VARIABLES LIKE 'slow_query%';
+---------------------+---------------------------------------------------------------------+
| Variable_name       | Value                                                               |
+---------------------+---------------------------------------------------------------------+
| slow_query_log      | OFF                                                                 |
| slow_query_log_file | C:ProgramDataMySQLMySQL Server 5.7DataLAPTOP-UHQ6V8KP-slow.log |
+---------------------+---------------------------------------------------------------------+
2 rows in set, 1 warning (0.02 sec)

mysql> SHOW VARIABLES LIKE 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set, 1 warning (0.01 sec)

参数说明

  • slow_query_log:表示慢查询是否处于开启状态
  • slow_query_log_file:表示慢查询日志的存放位置(一般会放在 MySQL 的数据目录中)
  • long_query_time:表示查询超过多少秒后才会被记录

启动和设置慢查询日志

可以通过 log-slow-queries 选项来开启慢查询日志,再通过 long_query_time 选项设置时间阈值,单位是秒。

只要查询耗时超过这个设定值,对应的 SQL 语句就会被写入慢查询日志。

通常做法是把 log_slow_queries 选项和 long_query_time 选项加到配置文件的 [mysqld] 组中,格式如下:

[mysqld]
log-slow-queries=dirfilename
long_query_time=n

MySQL慢查询日志(Slow Query Log)

参数含义

  • dir 参数指定慢查询日志的存储路径,如果不指定存储路径,慢查询日志将默认存储到 MySQL 数据库的数据文件夹下。
  • filename 参数指定日志的文件名,生成日志文件的完整名称为 filename-slow.log。 如果不指定文件名,默认文件名为 hostname-slow.log,hostname 是 MySQL 服务器的主机名。
  • “n”参数是设定的时间值,该值的单位是秒。如果不设置 long_query_time 选项,默认时间为 10 秒。

还可以通过以下命令启动慢查询日志、设置指定时间:

SET GLOBAL slow_query_log=ON/OFF;
SET GLOBAL long_query_time=n;

查看慢查询日志

如果你想查看哪些查询语句的执行效率低,可以从慢查询日志中获得信息。

和错误日志、查询日志一样,慢查询日志也是以文本文件的形式存储的,可以使用普通的文本文件查看工具来查看。

例 1

开启 MySQL 慢查询日志功能,并设置时间,命令和执行过程如下:

mysql> SET GLOBAL slow_query_log=ON;
Query OK, 0 rows affected (0.05 sec)

mysql> SET GLOBAL long_query_time=0.001;
Query OK, 0 rows affected (0.00 sec)

由于需要演示,这里我们将时间设置为了 0.001 秒

执行时间超过 0.001 秒的 SQL 语句将被记录到日志中。

查询 tb_student 表中的数据,SQL 语句和执行过程如下:

mysql> USE test;
Database changed
mysql> SELECT * FROM tb_student;
+----+--------+
| id | name   |
+----+--------+
|  1 | Ja va   |
|  2 | MySQL  |
|  3 | Python |
+----+--------+
3 rows in set (0.08 sec)

相应的,慢查询日志的部分内容如下:

# Time: 2020-06-01T01:59:18.368780Z
# User@Host: root[root] @ localhost [::1]  Id:     3
# Query_time: 0.006281  Lock_time: 0.000755 Rows_sent: 2  Rows_examined: 1034
use test;
SET timestamp=1590976758;
SHOW VARIABLES LIKE 'slow_query%';

删除慢查询日志

慢查询日志的删除方法与通用日志的删除方法是一样的。

可以使用 mysqladmin 命令来删除,也可以使用手工方式来删除。mysqladmin 命令的语法如下:

mysqladmin -uroot -p flush-logs

执行该命令后,命令行会提示输入密码。

输入正确密码后,将执行删除操作。新的慢查询日志会直接覆盖旧的查询日志,不需要再手动删除。

数据库管理员也可以手工删除慢查询日志,删除之后需要重新启动 MySQL 服务。

这里有个细节很容易被忽略:通用查询日志和慢查询日志用的是同一条命令。

也正因为如此,这个命令一旦执行,通用查询日志和慢查询日志都会切换到新的日志文件里,后续内容只会写入新文件。

要是还需要保留旧的慢查询日志,正确做法是先把旧日志文件改名,然后再重启 MySQL 服务,或者执行 mysqladmin 命令。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多