MySQL常用慢查询分析工具详解


Posted in MySQL onAugust 14, 2022

引言

在日常的业务开发中
MySQL 出现慢查询是很常见的

大部分情况下会分为两种情况:

  • 1、业务增长太快
  • 2、要么就是SQL 写的太xx了

所以
对慢查询 SQL 进行分析和优化很重要
其中 mysqldumpslow 是 MySQL 服务自带的一款很好的分析调优工具

1、调优工具mysqldumpslow

1.1调优工具常用设置

1、什么是MySQL 慢查询日志

MySQL提供的一种慢查询日志记录,用来记录在MySQL查询中响应时间超过阀值的记录 具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中

2、如何查看慢查询设置情况

慢查询的时间阈值设置

show variables like '%slow_query_log%';

MySQL常用慢查询分析工具详解

解释:

  • slow_query_log //是否开启,默认关闭,建议调优时才开启
  • slow_query_log_file //慢查询日志存放路径

3、如何开启慢查询日志记录

1) 命令开启

set global slow_query_log =1; //只对当前会话生效,重启失效

执行成功

再次执行

show variables like '%slow_query_log%';

先关闭客户端连接,再进行重新连接,即可看到设置生效

发现开启了mysqldumpslow调优工具

mysql> show variables like '%slow_query_log%';
+---------------------+-------------------------------------------+
| Variable_name       | Value                                     |
+---------------------+-------------------------------------------+
| slow_query_log      | ON                                        |
| slow_query_log_file | /opt/mysql-5.7.28/data/linux-141-slow.log |
+---------------------+-------------------------------------------+
2 rows in set (0.02 sec)

mysql>

2)配置文件开启

vim my.cnf
在[mysqld]下添加:
slow_query_log = 1
slow_query_log_file = /opt/mysql-5.7.28/data/linux-141-slow.log
重启MySQL服务

修改并且重启后

发现开启了mysqldumpslow调优工具

mysql> show variables like '%slow_query_log%';
+---------------------+-------------------------------------------+
| Variable_name       | Value                                     |
+---------------------+-------------------------------------------+
| slow_query_log      | ON                                        |
| slow_query_log_file | /opt/mysql-5.7.28/data/linux-141-slow.log |
+---------------------+-------------------------------------------+
2 rows in set (0.02 sec)

mysql>

3)哪些 SQL 会记录到慢查询日志

-- 查看阀值(大于),默认10s
show variables like 'long_query_time%';

MySQL常用慢查询分析工具详解

默认值是10秒

4)如何设置查询阀值

命令设置

-- 设置慢查询阀值
set global long_query_time = 1;

备注:另外开一个session或重新连接 ,才会看到变化

执行成功发发现慢sql的时间变成了1秒

MySQL常用慢查询分析工具详解

配置文件设置:

vim my.cnf
[mysqld]
long_query_time = 1
log_output = FILE
重启MySQL服务

执行成功发发现慢sql的时间变成了1秒

MySQL常用慢查询分析工具详解

5)如何把未使用索引的 SQL 记录写入慢查询日志

-- 查看设置,默认关闭
show variables like 'log_queries_not_using_indexes';

我们发现,未使用索引的sql默认是不记录到慢查询日志的

MySQL常用慢查询分析工具详解

开启配置:

set global log_queries_not_using_indexes = on;

执行如下:

MySQL常用慢查询分析工具详解

6)模拟数据

-- 睡眠2s再执行
select sleep(2);
-- 查看慢查询条数
show global status like '%Slow_queries%';

我们发现,每执行一次select sleep(2),之后,再通过show global status ...命令,他的值就会+1

MySQL常用慢查询分析工具详解

1.2 调优工具常用命令

语法格式

mysqldumpslow [ OPTS... ] [ LOGS... ] //命令行格式

常用到的格式组合:

  • -s 表示按照何种方式排序
  • c 访问次数
  •  l 锁定时间
  •  r 返回记录
  •  t 查询时间
  • al 平均锁定时间
  •  ar 平均返回记录数
  •  at  平均查询时间
  • -t 返回前面多少条数据
  • -g 后边搭配一个正则匹配模式,大小写不敏感

1、拿到慢日志路径

show variables like '%slow_query_log%';

日志路径为:/opt/mysql-5.7.28/data/linux-141-slow.log

查看日志

[root@linux-141 mysql-5.7.28]# cat /opt/mysql-5.7.28/data/linux-141-slow.log
/opt/mysql-5.7.28/bin/mysqld, Version: 5.7.28-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument
# Time: 2021-09-15T01:40:31.342430Z
# User@Host: root[root] @  [192.168.36.1]  Id:     2
# Query_time: 2.000863  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
use itcast;
SET timestamp=1631670031;
-- 睡眠2s再执行
select sleep(2);
[root@linux-141 mysql-5.7.28]#

2、得到访问次数最多的10条SQL

[root@linux-141 mysql-5.7.28]# ./bin/mysqldumpslow -s r -t  10 /opt/mysql-5.7.28/data/linux-141-slow.log
-bash: ./bin/mysqldumpslow: /usr/bin/perl: 坏的解释器: 没有那个文件或目录
[root@linux-141 mysql-5.7.28]# yum -y install perl perl-devel
[root@linux-141 mysql-5.7.28]# ./bin/mysqldumpslow -s r -t  10 /opt/mysql-5.7.28/data/linux-141-slow.log

3、按照时间排序的前10条里面含有左连接的SQL

[root@linux-141 mysql-5.7.28]# ./bin/mysqldumpslow -s t -t 10 -g "left join"  /opt/mysql-5.7.28/data/linux-141-slow.log

Reading mysql slow query log from /opt/mysql-5.7.28/data/linux-141-slow.log
Died at ./bin/mysqldumpslow line 167, <> chunk 28.
[root@linux-141 mysql-5.7.28]#

1.3 慢日志文件分析

1、查看慢查询日志

[root@linux-141 mysql-5.7.28]# cat /opt/mysql-5.7.28/data/linux-141-slow.log
/opt/mysql-5.7.28/bin/mysqld, Version: 5.7.28-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /tmp/mysql.sock
Time                 Id Command    Argument
# Time: 2021-09-15T01:40:31.342430Z
# User@Host: root[root] @  [192.168.36.1]  Id:     2
# Query_time: 2.000863  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
use itcast;
SET timestamp=1631670031;
-- 睡眠2s再执行
select sleep(2);
# Time: 2021-09-15T01:50:32.130305Z
# User@Host: root[root] @  [192.168.36.1]  Id:     2
# Query_time: 3.001904  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1631670632;
select sleep(3);
# Time: 2021-09-15T01:50:55.064372Z
# User@Host: root[root] @  [192.168.36.1]  Id:     2
# Query_time: 4.008082  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1631670655;
select sleep(4);
# Time: 2021-09-15T01:51:01.343463Z
# User@Host: root[root] @  [192.168.36.1]  Id:     2
# Query_time: 5.007035  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
SET timestamp=1631670661;
select sleep(5);
# Time: 2021-09-15T01:51:07.737834Z                                         ###### 执行SQL时间
# User@Host: root[root] @  [192.168.36.1]  Id:     2                        ###### 执行SQL的主机信息
# Query_time: 6.009129  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0    ###### SQL的执行信息
SET timestamp=1631670667;                                                    ###### SQL执行时间
select sleep(6);                                                            ###### SQL内容
[root@linux-141 mysql-5.7.28]#

属性解释

# Time: 2021-09-15T01:51:07.737834Z                                         ###### 执行SQL时间
# User@Host: root[root] @  [192.168.36.1]  Id:     2                        ###### 执行SQL的主机信息
# Query_time: 6.009129  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0    ###### SQL的执行信息
SET timestamp=1631670667;                                                    ###### SQL执行时间
select sleep(6);                                                            ###### SQL内容

2、 调优工具show profile

tips:

show profile,它也是调优工具

也是MySQL服务自带的分析调优工具

不过这款更高级

比较接近底层硬件参数的调优。

简介:

show profile是MySQL服务自带更高级的分析调优工具

比较接近底层硬件参数的调优

1、查看show profile设置

-- 默认关闭,保存近15次的运行结果
show variables like 'profiling%';

MySQL常用慢查询分析工具详解

通过上面我们发现,show profile工具默认是关闭状态,15表示保存了近15次的运行结果。

2、开启调优工具

执行下面的命令开启

SET profiling = ON;

再次查看状态

show variables like 'profiling%';

MySQL常用慢查询分析工具详解

3、查看最近15次的运行结果

-- 查看最近15次的运行结果
show profiles;

-- 可以显示警告和报错的信息
show warnings;

-- 慢查询语句
SELECT * FROM product_list WHERE store_name = '联想北达兴科专卖店';

显示最近15次的运行结果

MySQL常用慢查询分析工具详解

4、诊断运行的SQL

接下来,我们一起诊断一下query id为23的慢查询

-- 语法
SHOW PROFILE cpu,block io FOR QUERY query id;
-- 示例
SHOW PROFILE cpu,block io FOR QUERY 129;

开始执行:

MySQL常用慢查询分析工具详解

 解释:通过Status一列,可以看到整条SQL的运行过程

  • 1. starting //开始
  • 2. checking permissions //检查权限
  • 3. Opening tables //打开数据表
  • 4. init //初始化
  • 5. System lock //锁机制
  • 6. optimizing //优化器
  • 7. statistics //分析语法树
  • 8. prepareing //预准备
  • 9. executing //引擎执行开始
  • 10. end //引擎执行结束
  • 11. query end //查询结束
  • 12. closing tables //释放数据表
  • 13. freeing items //释放内存
  • 14. cleaning up //彻底清理
查看类型选项
SHOW PROFILE...后面的列,即:SHOW PROFILE ALL, BLOCK IO, ... FOR QUERY 209;
ALL //显示索引的开销信息
BLOCK IO //显示块IO相关开销
CONTEXT SWITCHES  //上下文切换相关开销
CPU //显示CPU相关开销信息
IPC //显示发送和接收相关开销信息
MEMORY //显示内存相关开销信息
PAGE FAULTS //显示页面错误相关开销信息
SOURCE //显示和source_function,source_file,source_line相关的开销信息
SWAPS //显示交换次数相关开销的信息

重要提示:

如出现以下一种或者几种情况,说明SQL执行性能极其低下,亟需优化
* converting HEAP to MyISAM  //查询结果太大,内存都不够用了往磁盘上搬了
* Creating tmp table //创建临时表:拷贝数据到临时表,用完再删
* Copying to tmp table on disk //把内存中临时表复制到磁盘,危险
* locked //出现死锁

到此这篇关于MySQL常用慢查询分析工具详解的文章就介绍到这了,更多相关MySQL慢查询工具内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
详解mysql三值逻辑与NULL
May 19 MySQL
正确使用MySQL update语句
May 26 MySQL
MySQL8.0无法启动3534的解决方法
Jun 03 MySQL
Mysql systemctl start mysqld报错的问题解决
Jun 03 MySQL
mysql联合索引的使用规则
Jun 23 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
Mysql中有关Datetime和Timestamp的使用总结
Dec 06 MySQL
彻底解决MySQL使用中文乱码的方法
Jan 22 MySQL
MySQL高级进阶sql语句总结大全
Mar 16 MySQL
详解MySQL的主键查询为什么这么快
Apr 03 MySQL
Mysql 数据库中的 redo log 和 binlog 写入策略
Apr 26 MySQL
解决Mysql报错 Table 'mysql.user' doesn't exist
May 06 MySQL
了解MySQL查询语句执行过程(5大组件)
Aug 14 #MySQL
MySQL 原理与优化之Update 优化
Aug 14 #MySQL
MySql统计函数COUNT的具体使用详解
Aug 14 #MySQL
MySQL 原理与优化之Limit 查询优化
MySQL 原理优化之Group By的优化技巧
Aug 14 #MySQL
mysql函数之截取字符串的实现
Aug 14 #MySQL
MySQL 原理与优化之原数据锁的应用
You might like
php实现多张图片上传加水印技巧
2013/04/18 PHP
PHP函数之日期时间函数date()使用详解
2013/09/09 PHP
浅谈php命令行用法
2015/02/04 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
2016/03/01 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
Javascript中暂停功能的实现代码
2007/03/04 Javascript
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
介绍Python中的fabs()方法的使用
2015/05/14 Python
Python 3.x 新特性及10大变化
2015/06/12 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
详解用python自制微信机器人,定时发送天气预报
2019/03/25 Python
python如何实现视频转代码视频
2019/06/17 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
python中利用matplotlib读取灰度图的例子
2019/12/07 Python
PyTorch加载自己的数据集实例详解
2020/03/18 Python
html5使用canvas绘制一张图片
2014/12/15 HTML / CSS
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
软件测试工程师面试问题精选
2016/10/28 面试题
室内拓展活动方案
2014/02/13 职场文书
计算机应届毕业生自荐信范文
2014/02/23 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
2014校长四风问题对照检查材料思想汇报
2014/09/16 职场文书
优秀教师申报材料
2014/12/16 职场文书
酒店前台辞职书
2015/02/26 职场文书
教师教育教学随笔
2015/08/15 职场文书
react国际化react-intl的使用
2021/05/06 Javascript
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL
码云(gitee)通过git自动同步到阿里云服务器
2022/12/24 Servers