关于java:性能优化MySQL常用慢查询分析工具

8次阅读

共计 6118 个字符,预计需要花费 16 分钟才能阅读完成。

罕用慢查问剖析工具

引言
在日常的业务开发中
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 // 慢查问日志寄存门路

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%';

默认值是 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: 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%';

通过下面咱们发现,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 // 呈现死锁

本文由传智教育博学谷 – 狂野架构师教研团队公布,转载请注明出处!

如果本文对您有帮忙,欢送关注和点赞;如果您有任何倡议也可留言评论或私信,您的反对是我保持创作的能源

正文完
 0