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 update set 和 and的区别
May 08 MySQL
Mysql 如何实现多张无关联表查询数据并分页
Jun 05 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 MySQL
SQL实战演练之网上商城数据库商品类别数据操作
Oct 24 MySQL
一文带你探究MySQL中的NULL
Nov 11 MySQL
MySQL创建管理RANGE分区
Apr 13 MySQL
Mysql调整优化之四种分区方式以及组合分区
Apr 13 MySQL
mysql 子查询的使用
Apr 28 MySQL
MySQL 数据表操作
May 04 MySQL
MySQL sql模式设置引起的问题
May 15 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
关于mysql中string和number的转换问题
Jun 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
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
typecho插件编写教程(一):Hello World
2015/05/28 PHP
CodeIgniter中使用Smarty3基本配置
2015/06/29 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
jQuery实现瀑布流的取巧做法分享
2015/01/12 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
JavaScript+CSS无限极分类效果完整实现方法
2015/12/22 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
Bootstrap框架下下拉框select搜索功能
2020/03/26 Javascript
Node.js利用debug模块打印出调试日志的方法
2017/04/25 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
vue中使用input[type=&quot;file&quot;]实现文件上传功能
2018/09/10 Javascript
vue路由--网站导航功能详解
2019/03/29 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
2019/04/17 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
vue实现轮播图帧率播放
2021/01/26 Vue.js
Python3.遍历某文件夹提取特定文件名的实例
2018/04/26 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
基于腾讯云服务器部署微信小程序后台服务(Python+Django)
2019/05/08 Python
Flask框架钩子函数功能与用法分析
2019/08/02 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
python 元组和列表的区别
2020/12/30 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
使用CSS3来代替JS实现交互
2017/08/10 HTML / CSS
英国儿童家具专卖店:GLTC
2016/09/24 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
运动会通讯稿100字
2014/01/31 职场文书
对公司合理化的建议书
2014/03/12 职场文书
珍惜资源保护环境的建议书
2014/05/14 职场文书
长城的导游词
2015/01/30 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL