MySQL 慢查询日志slow query log

MySQL 的慢查询日志(slow query log)是用于记录执行时间超过指定阈值的 SQL 语句的日志,主要用于性能分析和优化。以下是关于慢查询日志的详细介绍和操作指南:

登录 MySQL 后,执行以下命令查看慢查询相关参数:

sql 复制代码
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开启,即使执行时间未达阈值也会记录)。

  1. 临时开启 / 修改配置(无需重启 MySQL)
    适合临时调试,MySQL 重启后会失效:
    sql
    -- 开启慢查询日志
sql 复制代码
set global slow_query_log = ON;

-- 设置日志文件路径(需确保MySQL有权限写入)

sql 复制代码
set global slow_query_log_file = '/var/log/mysql/slow.log';

-- 设置慢查询阈值(如1秒,支持小数)

sql 复制代码
set global long_query_time = 1;

-- 记录未使用索引的查询(慎用,可能产生大量日志)

sql 复制代码
set global log_queries_not_using_indexes = ON;
| slow_query_log_file | /data/3307/data/oracle-slow.log 
  1. 永久配置(推荐)
    修改 MySQL 配置文件(my.cnf或my.ini),重启服务后生效:
sql 复制代码
[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
sql 复制代码
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |    10秒
+-----------------+-----------+
sql 复制代码
[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

重启数据库

powershell 复制代码
[root@oracle 3307]# systemctl restart mysqld3307.service

使用t100w表做些慢查询的数据

sql 复制代码
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有索引

sql 复制代码
mysql> select *  from t100w where  k1='lm' limit 600;

多执行做一些数据

查看慢日志文件

powershell 复制代码
[root@oracle data]# vim slow.log 

通过分析慢语句去优化查询

三、慢查询日志的分析

  1. 直接查看日志内容
    慢查询日志的每条记录包含以下关键信息:
    执行时间(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行
  2. 使用专用工具分析
    mysqldumpslow(MySQL 自带):
    汇总慢查询日志,按执行次数、时间等排序:
    bash
    查看使用最频繁的10条慢查询
bash 复制代码
mysqldumpslow -s c -t 10 /var/log/mysql/slow.log

查看执行时间最长的10条慢查询

bash 复制代码
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

参数说明:-s c(按次数)、-s t(按时间)、-t 10(显示前 10 条)。

bash 复制代码
[root@oracle data]# mysqldumpslow -s c -t 10  slow.log 
bash 复制代码
Reading mysql slow query log from slow.log
Count: 10  Time=0.72s (7s)  Lock=0.00s (0s)  Rows=233.7 (2337), root[root]@localhost
  select *  from t100w where  k1='S' limit N
简化成一类语句,进行执行计划分析,是否走索引,然后优化

Count: 1  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=600.0 (600), root[root]@localhost
  select *  from t100w where  id>N limit N

Count: 1  Time=0.00s (0s)  Lock=0.01s (0s)  Rows=600.0 (600), root[root]@localhost
  select *  from t100w where  id!=N limit N

Died at /application/mysql/bin/mysqldumpslow line 161, <> chunk 12.
[root@oracle data]# 

pt-query-digest(Percona Toolkit 工具):

更强大的分析工具,支持按 SQL 模板分组、计算平均耗时等:

bash

bash 复制代码
pt-query-digest /var/log/mysql/slow.log

pt-query-digest(Percona Toolkit 工具):安装

安装 pt-query-digest 工具可以通过以下步骤完成:

下载工具:从 Percona 官方网站获取工具包。

bash 复制代码
https://www.percona.com/downloads

wget https://downloads.percona.com/downloads/percona-toolkit/3.5.0/binary/tarball/percona-toolkit-3.5.0_x86_64.tar.gz

解压安装:

bash 复制代码
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. 使用以下命令解决。

bash 复制代码
yum install perl-ExtUtils-MakeMaker

然后继续执行上面语句

bash 复制代码
perl Makefile.PL PREFIX=/usr/local/percona-toolkit
bash 复制代码
make && make install

控制台输出如下,则编译安装成功。

安装依赖:确保安装了 Perl 模块,如 perl-DBD-MySQL 和 perl-Digest-MD5。

bash 复制代码
yum install perl-DBD-MySQL perl-Digest-MD5

学习跟使用Percona Toolkit 工具 的使用方法

华为云社区开发者博客:

使用 pt-query-digest 工具分析 MySQL 慢日志

https://bbs.huaweicloud.com/blogs/432109

进入到安装路径下面

bash 复制代码
[root@oracle bin]# ./pt-query-digest   /data/3307/data/slow.log   >  /data/3307/data/A.txt

修改环境变量

bash 复制代码
[root@oracle data]# vim /etc/profile

添加pt工具的安装路径

bash 复制代码
export PATH=$PATH:/application/mysql/bin:/server/tools/percona-toolkit-3.5.0/bin

使之生效

bash 复制代码
[root@oracle data]# source /etc/profile

更多工具使用方法自己进行知识扩充

相关推荐
来自宇宙的曹先生2 小时前
MySQL 存储引擎 API
数据库·mysql
间彧2 小时前
MySQL Performance Schema详解与实战应用
数据库
间彧2 小时前
MySQL Exporter采集的关键指标有哪些,如何解读这些指标?
数据库
weixin_446260853 小时前
Django - 让开发变得简单高效的Web框架
前端·数据库·django
mpHH3 小时前
babelfish for postgresql 分析--todo
数据库·postgresql
zizisuo3 小时前
解决在使用Lombok时maven install 找不到符号的问题
java·数据库·maven
老苏畅谈运维4 小时前
Oracle的connect by level在MySQL中的华丽变身
mysql·oracle
程序边界5 小时前
国产之光!金仓数据库KingbaseES Oracle兼容性深度体验大赏
数据库·oracle
A阳俊yi5 小时前
Spring——声明式事务
java·数据库·spring