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

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

相关推荐
15Moonlight17 分钟前
06-MySQL基础查询
数据库·c++·mysql·1024程序员节
nzxzn30 分钟前
MYSQL第三次作业
数据库·mysql
m0_6740314337 分钟前
GitHub等平台形成的开源文化正在重也有人
java·windows·mysql
l1t1 小时前
在DuckDB中使用http(s)代理
数据库·网络协议·http·xlsx·1024程序员节·duckdb
十碗饭吃不饱1 小时前
RuoYi/ExcelUtil修改(导入excel表时,表中字段没有映射上数据库表字段)
数据库·windows·excel
m0_674031432 小时前
GitHub等平台形成的开源文化正在重塑林语堂
windows·mysql·spring
李小白662 小时前
Redis常见指令
数据库·redis·缓存
聆风吟º2 小时前
【Spring Boot 报错已解决】别让端口配置卡壳!Spring Boot “Binding to target failed” 报错解决思路
android·java·spring boot
雨奔2 小时前
Flask 学习路线图
数据库·学习·flask
TDengine (老段)2 小时前
从“事后抢险”到“事前防控”:江西水投用 TDengine 时序数据库重塑防汛模式
大数据·数据库·物联网·时序数据库·tdengine·涛思数据·1024程序员节