MySQL 慢查询日志slow query log
MySQL 的慢查询日志(slow query log)是用于记录执行时间超过指定阈值的 SQL 语句的日志,主要用于性能分析和优化。以下是关于慢查询日志的详细介绍和操作指南:
登录 MySQL 后,执行以下命令查看慢查询相关参数:
show variables like '%slow_query%';
show variables like 'long_query_time';
关键参数说明:
slow_query_log:是否开启慢查询日志(ON为开启,OFF为关闭)。
slow_query_log_file:慢查询日志文件路径(如/var/lib/mysql/hostname-slow.log)。
long_query_time:慢查询阈值(单位:秒),执行时间超过此值的 SQL 会被记录(默认 10 秒,可精确到小数,如 0.5 秒)。
log_queries_not_using_indexes:是否记录未使用索引的查询(ON开启,即使执行时间未达阈值也会记录)。
- 临时开启 / 修改配置(无需重启 MySQL)
适合临时调试,MySQL 重启后会失效:
sql
– 开启慢查询日志
set global slow_query_log = ON;
– 设置日志文件路径(需确保MySQL有权限写入)
set global slow_query_log_file = '/var/log/mysql/slow.log';
– 设置慢查询阈值(如1秒,支持小数)
set global long_query_time = 1;
– 记录未使用索引的查询(慎用,可能产生大量日志)
set global log_queries_not_using_indexes = ON;
| slow_query_log_file | /data/3307/data/oracle-slow.log
- 永久配置(推荐)
修改 MySQL 配置文件(my.cnf或my.ini),重启服务后生效:
[mysqld]开启慢查询日志
slow_query_log = 1日志文件路径
slow_query_log_file = /data/3307/data/slow.log
#慢查询阈值(0.1秒)
long_query_time = 0.1记录未使用索引的查询(可选)
log_queries_not_using_indexes = 1
#记录管理语句(如ALTER TABLE,可选)
log_slow_admin_statements = 1
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 | 10秒
+-----------------+-----------+
[root@oracle 3307]# cat my.cnf
[mysqld]
user=mysql
basedir=/application/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
log_error=/data/3307/mysql.log
port=3307
gtid_mode=ON
enforce_gtid_consistency=ON
autocommit=0
server_id=7
log_bin=/data/3307/mysql-bin
binlog_format=row
slow_query_log = 1
slow_query_log_file = /data/3307/data/slow.log
long_query_time = 0.1
log_queries_not_using_indexes = 1
重启数据库
[root@oracle 3307]# systemctl restart mysqld3307.service
使用t100w表做些慢查询的数据
mysql> select * from t100w where k1='aa' limit 100;
……
| 396221 | 994690 | aa | ab89 | 2019-07-09 16:08:12 |
+--------+--------+------+------+---------------------+
100 rows in set (0.50 sec)
0.5秒
只有k2有索引
mysql> select * from t100w where k1='lm' limit 600;
多执行做一些数据
查看慢日志文件
[root@oracle data]# vim slow.log
通过分析慢语句去优化查询
三、慢查询日志的分析
- 直接查看日志内容
慢查询日志的每条记录包含以下关键信息:
执行时间(Time)
执行时长(Query_time,单位秒)
锁定时间(Lock_time)
扫描行数(Rows_examined)
影响行数(Rows_sent)
具体 SQL 语句
示例片段:
plaintext
#Time: 2023-10-01T12:34:56.789000Z
#User@Host: root[root] @ localhost [] Id: 123
Query_time: 2.500000 Lock_time: 0.000100 Rows_sent: 100 Rows_examined: 10000
use testdb;
SET timestamp=1696154096;
SELECT * FROM users WHERE age > 30; – 未使用索引,扫描10000行 - 使用专用工具分析
mysqldumpslow(MySQL 自带):
汇总慢查询日志,按执行次数、时间等排序:
bash
查看使用最频繁的10条慢查询
mysqldumpslow -s c -t 10 /var/log/mysql/slow.log
查看执行时间最长的10条慢查询
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log
参数说明:-s c(按次数)、-s t(按时间)、-t 10(显示前 10 条)。
[root@oracle data]# mysqldumpslow -s c -t 10 slow.log
Reading mysql slow query log from slow.log
Count: 10 Time=0.72s (7s) Lock=0.00s (0s) Rows=233.7 (2337), root[root]@localhostselect * from t100w where k1='S' limit N
简化成一类语句,进行执行计划分析,是否走索引,然后优化Count: 1 Time=0.00s (0s) Lock=0.00s (0s) Rows=600.0 (600), root[root]@localhostselect * from t100w where id>N limit NCount: 1 Time=0.00s (0s) Lock=0.01s (0s) Rows=600.0 (600), root[root]@localhostselect * from t100w where id!=N limit NDied at /application/mysql/bin/mysqldumpslow line 161, <> chunk 12.
[root@oracle data]#
pt-query-digest(Percona Toolkit 工具):
更强大的分析工具,支持按 SQL 模板分组、计算平均耗时等:
bash
pt-query-digest /var/log/mysql/slow.log
pt-query-digest(Percona Toolkit 工具):安装
安装 pt-query-digest 工具可以通过以下步骤完成:
下载工具:从 Percona 官方网站获取工具包。
https://www.percona.com/downloadswget https://downloads.percona.com/downloads/percona-toolkit/3.5.0/binary/tarball/percona-toolkit-3.5.0_x86_64.tar.gz
解压安装:
tar -zxvf percona-toolkit-3.5.0_x86_64.tar.gz
cd percona-toolkit-3.5.0
perl Makefile.PL PREFIX=/usr/local/percona-toolkit
报错如下:
Can’t locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib/perl5 /usr/local/share/perl5 /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5 /usr/share/perl5 .) at Makefile.PL line 2.
BEGIN failed–compilation aborted at Makefile.PL line 2.
步骤6. 使用以下命令解决。
yum install perl-ExtUtils-MakeMaker
然后继续执行上面语句
perl Makefile.PL PREFIX=/usr/local/percona-toolkit
make && make install
控制台输出如下,则编译安装成功。
安装依赖:确保安装了 Perl 模块,如 perl-DBD-MySQL 和 perl-Digest-MD5。
yum install perl-DBD-MySQL perl-Digest-MD5
学习跟使用Percona Toolkit 工具 的使用方法
华为云社区开发者博客:
使用 pt-query-digest 工具分析 MySQL 慢日志
https://bbs.huaweicloud.com/blogs/432109
进入到安装路径下面
[root@oracle bin]# ./pt-query-digest /data/3307/data/slow.log > /data/3307/data/A.txt
修改环境变量
[root@oracle data]# vim /etc/profile
添加pt工具的安装路径
export PATH=$PATH:/application/mysql/bin:/server/tools/percona-toolkit-3.5.0/bin
使之生效
[root@oracle data]# source /etc/profile
更多工具使用方法自己进行知识扩充