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 InnoDB存储引擎的内存管理
Apr 08 MySQL
Idea连接MySQL数据库出现中文乱码的问题
Apr 14 MySQL
MySQL 慢查询日志深入理解
Apr 22 MySQL
MySQL Threads_running飙升与慢查询的相关问题解决
May 08 MySQL
zabbix监控mysql的实例方法
Jun 02 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
MySQL索引是啥?不懂就问
Jul 21 MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 MySQL
mysql事务对效率的影响分析总结
Oct 24 MySQL
MySQL 外连接语法之 OUTER JOIN
Apr 09 MySQL
MySQL导致索引失效的几种情况
Jun 25 MySQL
MySQL性能指标TPS+QPS+IOPS压测
Aug 05 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
中国广播史趣谈 — 几个历史第一次
2021/03/01 无线电
php线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
2013/04/15 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
Stop SQL Server
2007/06/21 Javascript
jquery 问答知识整理
2010/02/11 Javascript
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
Javascript string 扩展库代码
2010/04/09 Javascript
js遍历td tr等html元素
2012/12/13 Javascript
JavaScript Math.ceil() 函数使用介绍
2013/12/11 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
Javascript递归打印Document层次关系实例分析
2015/05/15 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
用JS写的一个Ajax库(实例代码)
2016/08/06 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
Python常见工厂函数用法示例
2018/03/21 Python
对Python中for复合语句的使用示例讲解
2018/11/01 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
python常量折叠基础知识点讲解
2021/02/28 Python
HTML5移动端手机网站开发流程
2016/04/25 HTML / CSS
HTML5 拖放功能实现代码
2016/07/14 HTML / CSS
2019年c语言经典面试题目
2016/08/17 面试题
部队学习十八大感言
2014/01/11 职场文书
工程安全员岗位职责
2014/03/09 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
公司贷款承诺书
2014/05/30 职场文书
关于环保的标语
2014/06/13 职场文书
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
财政局个人年终总结
2015/03/03 职场文书
2016公司年会通知范文
2015/04/25 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
探究Mysql模糊查询是否区分大小写
2021/06/11 MySQL
索尼ICF-5900W收音机测评
2022/04/24 无线电