当前位置 : 主页 > 编程语言 > java >

【性能优化】MySQL常用慢查询分析工具

来源:互联网 收集:自由互联 发布时间:2022-07-22
常用慢查询分析工具引言在日常的业务开发中MySQL 出现慢查询是很常见的大部分情况下会分为两种情况1、业务增长太快2、要么就是SQL 写的太xx了所以对慢查询 SQL 进行分析和优化很重要
常用慢查询分析工具 引言 在日常的业务开发中 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%';

【性能优化】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常用慢查询分析工具_数据库_02

默认值是10秒

4)如何设置查询阀值

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

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

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

【性能优化】MySQL常用慢查询分析工具_数据库_03

配置文件设置

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

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

【性能优化】MySQL常用慢查询分析工具_数据库_04

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

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

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

【性能优化】MySQL常用慢查询分析工具_数据库_05

开启配置

set global log_queries_not_using_indexes = on;

执行如下

【性能优化】MySQL常用慢查询分析工具_mysql_06

6)模拟数据

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

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

【性能优化】MySQL常用慢查询分析工具_数据库_07

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: 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]#

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: 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内容

3.2 调优工具show profile

tips:

show profile,它也是调优工具

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

不过这款更高级

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

简介:

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

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

1、查看show profile设置

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

【性能优化】MySQL常用慢查询分析工具_mysql_08

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

2、开启调优工具

执行下面的命令开启

SET profiling = ON;

再次查看状态

show variables like 'profiling%';

【性能优化】MySQL常用慢查询分析工具_mysql_09

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

-- 查看最近15次的运行结果 show profiles; -- 可以显示警告和报错的信息 show warnings; -- 慢查询语句 SELECT * FROM product_list WHERE store_name = '联想北达兴科专卖店';

显示最近15次的运行结果

【性能优化】MySQL常用慢查询分析工具_mysql_10

4、诊断运行的SQL

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

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

开始执行

【性能优化】MySQL常用慢查询分析工具_数据库_11

解释: 通过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 //出现死锁

本文由育博学谷狂野架构师发布 如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力 转载请注明出处!

【文章出处:香港服务器 http://www.1234xp.com欢迎留下您的宝贵建议】
网友评论