【性能优化】MySQL常用慢查询分析工具
常用慢查询分析工具
引言
在日常的业务开发中
MySQL 出现慢查询是很常见的
大部分情况下会分为两种情况
1、业务增长太快
2、要么就是SQL 写的太xx了
所以
对慢查询 SQL 进行分析和优化很重要
其中 mysqldumpslow 是 MySQL 服务自带的一款很好的分析调优工具
3.1 调优工具mysqldumpslow
3.1.1 调优工具常用设置 1、什么是MySQL 慢查询日志
MySQL提供的一种慢查询日志记录,用来记录在MySQL查询中响应时间超过阀值的记录
具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中
2、如何查看慢查询设置情况
慢查询的时间阈值设置
show variables like '%slow_query_log%';
文章图片
解释
- slow_query_log //是否开启,默认关闭,建议调优时才开启
- slow_query_log_file //慢查询日志存放路径
1) 命令开启
set global slow_query_log =1;
//只对当前会话生效,重启失效
执行成功
再次执行
show variables like '%slow_query_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>
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%';
文章图片
默认值是10秒4)如何设置查询阀值
- 命令设置
-- 设置慢查询阀值
set global long_query_time = 1;
备注:另外开一个session或重新连接 ,才会看到变化
执行成功发发现慢sql的时间变成了1秒
文章图片
配置文件设置
vim my.cnf
[mysqld]
long_query_time = 1
log_output = FILE
重启MySQL服务
执行成功发发现慢sql的时间变成了1秒
文章图片
5)如何把未使用索引的 SQL 记录写入慢查询日志
-- 查看设置,默认关闭
show variables like 'log_queries_not_using_indexes';
我们发现,未使用索引的sql默认是不记录到慢查询日志的
文章图片
开启配置
set global log_queries_not_using_indexes = on;
执行如下
文章图片
6)模拟数据
-- 睡眠2s再执行
select sleep(2);
-- 查看慢查询条数
show global status like '%Slow_queries%';
我们发现,每执行一次select sleep(2),之后,再通过show global status ...命令,他的值就会+1
文章图片
3.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: 3306Unix socket: /tmp/mysql.sock
TimeId CommandArgument
# Time: 2021-09-15T01:40:31.342430Z
# User@Host: root[root] @[192.168.36.1]Id:2
# Query_time: 2.000863Lock_time: 0.000000 Rows_sent: 1Rows_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 -t10 /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 -t10 /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.logReading 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]#
3.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: 3306Unix socket: /tmp/mysql.sock
TimeId CommandArgument
# Time: 2021-09-15T01:40:31.342430Z
# User@Host: root[root] @[192.168.36.1]Id:2
# Query_time: 2.000863Lock_time: 0.000000 Rows_sent: 1Rows_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.001904Lock_time: 0.000000 Rows_sent: 1Rows_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.008082Lock_time: 0.000000 Rows_sent: 1Rows_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.007035Lock_time: 0.000000 Rows_sent: 1Rows_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.009129Lock_time: 0.000000 Rows_sent: 1Rows_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.009129Lock_time: 0.000000 Rows_sent: 1Rows_examined: 0###### SQL的执行信息
SET timestamp=1631670667;
###### SQL执行时间
select sleep(6);
###### SQL内容
3.2 调优工具show profile
tips:简介:
show profile,它也是调优工具
也是MySQL服务自带的分析调优工具
不过这款更高级
比较接近底层硬件参数的调优。
show profile是MySQL服务自带更高级的分析调优工具
比较接近底层硬件参数的调优
1、查看show profile设置
-- 默认关闭,保存近15次的运行结果
show variables like 'profiling%';
文章图片
通过上面我们发现,show profile工具默认是关闭状态,15表示保存了近15次的运行结果。
2、开启调优工具
执行下面的命令开启
SET profiling = ON;
再次查看状态
show variables like 'profiling%';
文章图片
3、查看最近15次的运行结果
-- 查看最近15次的运行结果
show profiles;
-- 可以显示警告和报错的信息
show warnings;
-- 慢查询语句
SELECT * FROM product_list WHERE store_name = '联想北达兴科专卖店';
显示最近15次的运行结果
文章图片
4、诊断运行的SQL
接下来,我们一起诊断一下query id为23的慢查询
-- 语法
SHOW PROFILE cpu,block io FOR QUERY query id;
-- 示例
SHOW PROFILE cpu,block io FOR QUERY 129;
开始执行
文章图片
解释:
通过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 //出现死锁
本文由传智教育博学谷 - 狂野架构师教研团队发布,转载请注明出处!
如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力
推荐阅读
- 【服务器数据恢复】断电导致存储raid6阵列瘫痪的数据恢复案例
- 【Java面试手册-算法篇】给定一个数字,请判断是否为回文数字()
- 超实用转型攻略!《2022央国企云原生落地实用指南》重磅发布(附下载链接)
- 想把我唱给你听
- D15.蜗牛计划
- 软件测试|软件测试初学者
- TP5.1 分页(带参数传递)
- 【一念笔记】新研究丨先胖后懒还是先懒后胖
- 未来5年计算机语言排行榜,2020 年 5 月的编程语言排行榜
- 求助【我的发小最近对我怪怪的,我该怎么办】(2)