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

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

相关推荐
倔强的石头_6 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
阿巴斯甜11 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker12 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952713 小时前
Andorid Google 登录接入文档
android
黄林晴14 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android