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分库分表与分区的入门指南
Apr 22 MySQL
MySQL去除重叠时间求时间差和的实现
Aug 23 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
MySQL实例精讲单行函数以及字符数学日期流程控制
Oct 15 MySQL
Mysql中一千万条数据怎么快速查询
Dec 06 MySQL
MySQL常见优化方案汇总
Jan 18 MySQL
浅谈redis的过期时间设置和过期删除机制
Mar 18 MySQL
一文了解MYSQL三大范式和表约束
Apr 03 MySQL
MySQL创建管理KEY分区
Apr 13 MySQL
解决MySQL报“too many connections“错误
Apr 19 MySQL
MySQL数据库事务的四大特性
Apr 20 MySQL
MySql按时,天,周,月进行数据统计
Aug 14 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中计算字符串相似度的函数代码
2012/12/29 PHP
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
PHP四舍五入、取整、round函数使用示例
2015/02/06 PHP
php源码 fsockopen获取网页内容实例详解
2016/09/24 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
PHP使用PDO、mysqli扩展实现与数据库交互操作详解
2019/07/20 PHP
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
js添加select下默认的option的value和text的方法
2014/10/19 Javascript
深入理解javascript变量声明
2014/11/20 Javascript
全面解析jQuery $(document).ready()和JavaScript onload事件
2016/06/08 Javascript
angularjs中ng-attr的用法详解
2016/12/31 Javascript
Vue指令的钩子函数使用方法
2017/03/20 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
vue项目创建步骤及路由router
2020/01/14 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
2020/10/13 Javascript
JavaScript实现点击切换验证码及校验
2021/01/10 Javascript
python实现多线程采集的2个代码例子
2014/07/07 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
使用HTML5做的导航条详细步骤
2020/10/19 HTML / CSS
致跳高运动员广播稿
2014/01/13 职场文书
个人先进事迹总结
2015/02/26 职场文书
2015年新教师工作总结
2015/04/28 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
公司业务员管理制度
2015/08/05 职场文书
聘任合同书
2015/09/21 职场文书
2016年小学生迎国庆广播稿
2015/12/18 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android