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

打印 上一主题 下一主题

主题 871|帖子 871|积分 2613

常用慢查询分析工具
  1. 引言
  2. 在日常的业务开发中
  3. MySQL 出现慢查询是很常见的
  4. 大部分情况下会分为两种情况
  5. 1、业务增长太快
  6. 2、要么就是SQL 写的太xx了
  7. 所以
  8. 对慢查询 SQL 进行分析和优化很重要
  9. 其中 mysqldumpslow 是 MySQL 服务自带的一款很好的分析调优工具
复制代码
3.1 调优工具mysqldumpslow

3.1.1 调优工具常用设置

1、什么是MySQL 慢查询日志
MySQL提供的一种慢查询日志记录,用来记录在MySQL查询中响应时间超过阀值的记录
具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中
2、如何查看慢查询设置情况
慢查询的时间阈值设置
  1. show variables like '%slow_query_log%';
复制代码

解释

  • slow_query_log  //是否开启,默认关闭,建议调优时才开启
  • slow_query_log_file //慢查询日志存放路径
3、如何开启慢查询日志记录
1) 命令开启
  1. set global slow_query_log =1; //只对当前会话生效,重启失效
复制代码
执行成功
再次执行
  1. show variables like '%slow_query_log%';
复制代码
先关闭客户端连接,再进行重新连接,即可看到设置生效
发现开启了mysqldumpslow调优工具
  1. mysql> show variables like '%slow_query_log%';
  2. +---------------------+-------------------------------------------+
  3. | Variable_name       | Value                                     |
  4. +---------------------+-------------------------------------------+
  5. | slow_query_log      | ON                                        |
  6. | slow_query_log_file | /opt/mysql-5.7.28/data/linux-141-slow.log |
  7. +---------------------+-------------------------------------------+
  8. 2 rows in set (0.02 sec)
  9. mysql>
复制代码
2)配置文件开启
  1. vim my.cnf
  2. 在[mysqld]下添加:
  3. slow_query_log = 1
  4. slow_query_log_file = /opt/mysql-5.7.28/data/linux-141-slow.log
  5. 重启MySQL服务
复制代码
修改并且重启后
发现开启了mysqldumpslow调优工具
  1. mysql> show variables like '%slow_query_log%';
  2. +---------------------+-------------------------------------------+
  3. | Variable_name       | Value                                     |
  4. +---------------------+-------------------------------------------+
  5. | slow_query_log      | ON                                        |
  6. | slow_query_log_file | /opt/mysql-5.7.28/data/linux-141-slow.log |
  7. +---------------------+-------------------------------------------+
  8. 2 rows in set (0.02 sec)
  9. mysql>
复制代码
3)哪些 SQL 会记录到慢查询日志
  1. -- 查看阀值(大于),默认10s
  2. show variables like 'long_query_time%';
复制代码

默认值是10秒
4)如何设置查询阀值

  • 命令设置
  1. -- 设置慢查询阀值
  2. set global long_query_time = 1;
复制代码
备注:另外开一个session或重新连接 ,才会看到变化
执行成功发发现慢sql的时间变成了1秒

配置文件设置
  1. vim my.cnf
  2. [mysqld]
  3. long_query_time = 1
  4. log_output = FILE
  5. 重启MySQL服务
复制代码
执行成功发发现慢sql的时间变成了1秒

5)如何把未使用索引的 SQL 记录写入慢查询日志
  1. -- 查看设置,默认关闭
  2. show variables like 'log_queries_not_using_indexes';
复制代码
我们发现,未使用索引的sql默认是不记录到慢查询日志的

开启配置
  1. set global log_queries_not_using_indexes = on;
复制代码
执行如下

6)模拟数据
  1. -- 睡眠2s再执行
  2. select sleep(2);
  3. -- 查看慢查询条数
  4. show global status like '%Slow_queries%';
复制代码
我们发现,每执行一次select sleep(2),之后,再通过show global status ...命令,他的值就会+1

3.1.2 调优工具常用命令

语法格式
  1. mysqldumpslow [ OPTS... ] [ LOGS... ] //命令行格式
复制代码
常用到的格式组合
  1. -s 表示按照何种方式排序
  2.     c 访问次数
  3.     l 锁定时间
  4.     r 返回记录
  5.     t 查询时间
  6.     al 平均锁定时间
  7.     ar 平均返回记录数
  8.     at  平均查询时间
  9. -t 返回前面多少条数据
  10. -g 后边搭配一个正则匹配模式,大小写不敏感
复制代码
1、拿到慢日志路径
  1. show variables like '%slow_query_log%';
复制代码
日志路径为:/opt/mysql-5.7.28/data/linux-141-slow.log
查看日志
  1. [root@linux-141 mysql-5.7.28]# cat /opt/mysql-5.7.28/data/linux-141-slow.log
  2. /opt/mysql-5.7.28/bin/mysqld, Version: 5.7.28-log (MySQL Community Server (GPL)). started with:
  3. Tcp port: 3306  Unix socket: /tmp/mysql.sock
  4. Time                 Id Command    Argument
  5. # Time: 2021-09-15T01:40:31.342430Z
  6. # User@Host: root[root] @  [192.168.36.1]  Id:     2
  7. # Query_time: 2.000863  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
  8. use itcast;
  9. SET timestamp=1631670031;
  10. -- 睡眠2s再执行
  11. select sleep(2);
  12. [root@linux-141 mysql-5.7.28]#
复制代码
2、得到访问次数最多的10条SQL
  1. [root@linux-141 mysql-5.7.28]# ./bin/mysqldumpslow -s r -t  10 /opt/mysql-5.7.28/data/linux-141-slow.log
  2. -bash: ./bin/mysqldumpslow: /usr/bin/perl: 坏的解释器: 没有那个文件或目录
  3. [root@linux-141 mysql-5.7.28]# yum -y install perl perl-devel
  4. [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
  1. [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
  2. Reading mysql slow query log from /opt/mysql-5.7.28/data/linux-141-slow.log
  3. Died at ./bin/mysqldumpslow line 167, <> chunk 28.
  4. [root@linux-141 mysql-5.7.28]#
复制代码
3.1.3 慢日志文件分析

1、查看慢查询日志
  1. [root@linux-141 mysql-5.7.28]# cat /opt/mysql-5.7.28/data/linux-141-slow.log
  2. /opt/mysql-5.7.28/bin/mysqld, Version: 5.7.28-log (MySQL Community Server (GPL)). started with:
  3. Tcp port: 3306  Unix socket: /tmp/mysql.sock
  4. Time                 Id Command    Argument
  5. # Time: 2021-09-15T01:40:31.342430Z
  6. # User@Host: root[root] @  [192.168.36.1]  Id:     2
  7. # Query_time: 2.000863  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
  8. use itcast;
  9. SET timestamp=1631670031;
  10. -- 睡眠2s再执行
  11. select sleep(2);
  12. # Time: 2021-09-15T01:50:32.130305Z
  13. # User@Host: root[root] @  [192.168.36.1]  Id:     2
  14. # Query_time: 3.001904  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
  15. SET timestamp=1631670632;
  16. select sleep(3);
  17. # Time: 2021-09-15T01:50:55.064372Z
  18. # User@Host: root[root] @  [192.168.36.1]  Id:     2
  19. # Query_time: 4.008082  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
  20. SET timestamp=1631670655;
  21. select sleep(4);
  22. # Time: 2021-09-15T01:51:01.343463Z
  23. # User@Host: root[root] @  [192.168.36.1]  Id:     2
  24. # Query_time: 5.007035  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
  25. SET timestamp=1631670661;
  26. select sleep(5);
  27. # Time: 2021-09-15T01:51:07.737834Z                                             ###### 执行SQL时间
  28. # User@Host: root[root] @  [192.168.36.1]  Id:     2                                                ###### 执行SQL的主机信息
  29. # Query_time: 6.009129  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0        ###### SQL的执行信息
  30. SET timestamp=1631670667;                                                                                                        ###### SQL执行时间
  31. select sleep(6);                                                                                                                        ###### SQL内容
  32. [root@linux-141 mysql-5.7.28]#
复制代码
属性解释
  1. # Time: 2021-09-15T01:51:07.737834Z                                             ###### 执行SQL时间
  2. # User@Host: root[root] @  [192.168.36.1]  Id:     2                                                ###### 执行SQL的主机信息
  3. # Query_time: 6.009129  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0        ###### SQL的执行信息
  4. SET timestamp=1631670667;                                                                                                        ###### SQL执行时间
  5. select sleep(6);                                                                                                                        ###### SQL内容
复制代码
3.2 调优工具show profile

tips:
show profile,它也是调优工具
也是MySQL服务自带的分析调优工具
不过这款更高级
比较接近底层硬件参数的调优。
简介:
show profile是MySQL服务自带更高级的分析调优工具
比较接近底层硬件参数的调优
1、查看show profile设置
  1. -- 默认关闭,保存近15次的运行结果
  2. show variables like 'profiling%';
复制代码

通过上面我们发现,show profile工具默认是关闭状态,15表示保存了近15次的运行结果。
2、开启调优工具
执行下面的命令开启
  1. SET profiling = ON;
复制代码
再次查看状态
  1. show variables like 'profiling%';
复制代码

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

4、诊断运行的SQL
接下来,我们一起诊断一下query id为23的慢查询
  1. -- 语法
  2. SHOW PROFILE cpu,block io FOR QUERY query id;
  3. -- 示例
  4. SHOW PROFILE cpu,block io FOR QUERY 129;
复制代码
开始执行
  1. 解释:
  2. 通过Status一列,可以看到整条SQL的运行过程
  3. 1. starting //开始
  4. 2. checking permissions //检查权限
  5. 3. Opening tables //打开数据表
  6. 4. init //初始化
  7. 5. System lock //锁机制
  8. 6. optimizing //优化器
  9. 7. statistics //分析语法树
  10. 8. prepareing //预准备
  11. 9. executing //引擎执行开始
  12. 10. end //引擎执行结束
  13. 11. query end //查询结束
  14. 12. closing tables //释放数据表
  15. 13. freeing items //释放内存
  16. 14. cleaning up //彻底清理
复制代码
  1. 查看类型选项
  2. SHOW PROFILE...后面的列,即:SHOW PROFILE ALL, BLOCK IO, ... FOR QUERY 209;
  3. ALL //显示索引的开销信息
  4. BLOCK IO //显示块IO相关开销
  5. CONTEXT SWITCHES  //上下文切换相关开销
  6. CPU //显示CPU相关开销信息
  7. IPC //显示发送和接收相关开销信息
  8. MEMORY //显示内存相关开销信息
  9. PAGE FAULTS //显示页面错误相关开销信息
  10. SOURCE //显示和source_function,source_file,source_line相关的开销信息
  11. SWAPS //显示交换次数相关开销的信息
复制代码
重要提示
  1. 如出现以下一种或者几种情况,说明SQL执行性能极其低下,亟需优化
  2. * converting HEAP to MyISAM  //查询结果太大,内存都不够用了往磁盘上搬了
  3. * Creating tmp table //创建临时表:拷贝数据到临时表,用完再删
  4. * Copying to tmp table on disk //把内存中临时表复制到磁盘,危险
  5. * locked //出现死锁
复制代码
本文由传智教育博学谷 - 狂野架构师教研团队发布
如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力
转载请注明出处!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

没腿的鸟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表