我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】

文章目录

分析慢SQL的步骤

  1. 慢查询的开启并捕获:开启慢查询日志,设置阈值,比如超过5秒钟的就是慢SQL,至少跑1天,看看生产的慢SQL情况,并将它抓取出来
  2. explain + 慢SQL分析
  3. show Profile。(比explain还要详细,可以查询SQL在MySQL数据库中的执行细节和生命周期情况)
  4. 运维经理 OR DBA,进行MySQL数据库服务器的参数调优。(后端程序员没有这个权限)

慢查询日志(定位慢sql)

基本介绍

慢查询日志是什么?

MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。

  • long_query_time的默认值为10,意思是运行10秒以上的语句
  • 由慢查询日志来查看哪些SQL超出了我们的最大忍耐时间值,比如一条SQL执行超过5秒钟,我们就算慢SQL,希望能收集超过5秒钟的SQL,结合之前explain进行全面分析

特别说明

**默认情况下,MySQL数据库没有开启慢查询日志,**需要我们手动来设置这个参数。

当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件。

查看慢查询日志是否开以及如何开启

  • 查看慢查询日志是否开启:SHOW VARIABLES LIKE '%slow_query_log%';
  • 开启慢查询日志:SET GLOBAL slow_query_log = 1;使用该方法开启MySQL的慢查询日志只对当前数据库生效,如果MySQL重启后会失效。
-- 指定数据库mysql> use advanced_mysql_learning;Database changed--  查看慢查询日志是否开启mysql> SHOW VARIABLES LIKE '%slow_query_log%';+---------------------+---------------------------------------------------------------------------+| Variable_name       | Value             |+---------------------+---------------------------------------------------------------------------+| slow_query_log      | OFF               || slow_query_log_file | D:\Development\Sql\Mysql\mysql8\exe\mysql-8.0.27-winx64\data\dam-slow.log |+---------------------+---------------------------------------------------------------------------+2 rows in set, 1 warning (0.00 sec)--  开启慢查询日志mysql> SET GLOBAL slow_query_log = 1;Query OK, 0 rows affected (0.01 sec)

如果要使慢查询日志永久开启(不推荐,浪费性能),需要修改my.cnf文件,在[mysqld]下增加修改参数。

# my.cnf[mysqld]# 开启慢查询slow_query_log=ON  # 指定存储慢查询日志的文件。如果这个文件不存在,会自动创建slow_query_log_file=/var/lib/mysql/slow.log

设置慢SQL的时间阈值

查看阈值

时间阈值是由参数long_query_time控制的,默认情况下long_query_time的值为10秒。

MySQL中查看long_query_time的时间:SHOW VARIABLES LIKE 'long_query_time%';

mysql> SHOW VARIABLES LIKE 'long_query_time%';+-----------------+-----------+| Variable_name   | Value     |+-----------------+-----------+| long_query_time | 10.000000 |+-----------------+-----------+1 row in set, 1 warning (0.00 sec)

注意:是超过阈值才会被记录,等于不会被记录

设置阈值

--  设置阈值mysql> set global long_query_time=3;Query OK, 0 rows affected (0.00 sec)--  可以发现设置没有成功mysql> SHOW VARIABLES LIKE 'long_query_time%';+-----------------+-----------+| Variable_name   | Value     |+-----------------+-----------+| long_query_time | 10.000000 |+-----------------+-----------+1 row in set, 1 warning (0.00 sec)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gUHfL6Vk-1687865296670)(assets/1687865275680-157.png)]

也可以不重启连接,使用如下命令直接查看

 show global variables like 'long_query_time';

也直接在my.cnf配置文件中修改

[mysqld]long_query_time=1

查询慢查询日志文件中的总记录条数

mysql> SHOW GLOBAL STATUS LIKE '%Slow_queries%';+---------------+-------+| Variable_name | Value |+---------------+-------+| Slow_queries  | 0     |+---------------+-------+1 row in set (0.00 sec)

日志分析

模拟慢查询

mysql> select sleep(4);+----------+| sleep(4) |+----------+|        0 |+----------+1 row in set (4.01 sec)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OGdIsGCB-1687865296671)(assets/1687865275680-158.png)]

# Time: 2023-06-22T03:40:45.171751Z# User@Host: root[root] @ localhost [::1]  Id:     8# Query_time: 4.004906  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 1use advanced_mysql_learning;SET timestamp=1687405241;select sleep(4);
  • use advanced_mysql_learning:使用的数据库
  • Query_time:实际查询时间,单位是秒
  • Lock_time:锁时间
  • select sleep(4):超时的语句

日志分析工具mysqldumpslow

在生产环境中,如果要手工分析日志,查找、分析SQL,显然是个体力活,MySQL提供了日志分析工具mysqldumpslow。比如有100条慢sql,如何快速找出出现频次最高的前5条。

查看mysqldumpslow的帮助文档

在Linux命令行窗口执行mysqldumpslow --help

mysqldumpslow --helpUsage: mysqldumpslow [ OPTS... ] [ LOGS... ]Parse and summarize the MySQL slow query log. Options are  --verbose    verbose  --debug      debug  --help       write this text to standard output  -v           verbose  -d           debug  -s ORDER     what to sort by (al, at, ar, c, l, r, t), 'at' is default  # 按照何种方式排序                al: average lock time # 平均锁定时间                ar: average rows sent # 平均返回记录数                at: average query time # 平均查询时间                 c: count  # 访问次数                 l: lock time  # 锁定时间                 r: rows sent  # 返回记录                 t: query time  # 查询时间   -r           reverse the sort order (largest last instead of first)  -t NUM       just show the top n queries  # 返回前面多少条记录  -a           don't abstract all numbers to N and strings to 'S'  -n NUM       abstract numbers with at least n digits within names  -g PATTERN   grep: only consider stmts that include this string    -h HOSTNAME  hostname of db server for *-slow.log filename (can be wildcard),               default is '*', i.e. match all  -i NAME      name of server instance (if using mysql.server startup script)  -l           don't subtract lock time from total time

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0KJ9s7Ju-1687865296672)(assets/1687865275680-159.png)]

常用命令案例

日志文件地址:/var/lib/mysql/slow.log

# 得到返回记录集最多的10个SQLmysqldumpslow -s r -t 10 /var/lib/mysql/slow.log # 得到访问次数最多的10个SQLmysqldumpslow -s c -t 10 /var/lib/mysql/slow.log # 得到按照时间排序的前10条里面含有左连接的查询语句mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow.log# 另外建议使用这些命令时结合|和more使用,否则出现爆屏的情况mysqldumpslow -s r -t 10 /var/lib/mysql/slow.log | more

文章说明

本文章为本人学习尚硅谷的学习笔记,文章中大部分内容来源于尚硅谷视频(点击学习尚硅谷相关课程),也有部分内容来自于自己的思考,发布文章是想帮助其他学习的人更方便地整理自己的笔记或者直接通过文章学习相关知识,如有侵权请联系删除,最后对尚硅谷的优质课程表示感谢。

来源地址:https://blog.csdn.net/laodanqiu/article/details/131423834

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL SQL性能分析之慢查询日志、explain使用详解

目录SQL执行频率慢查询日志profileexplainSQL执行频率mysql 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的insert
2023-04-14

MySQL SQL性能分析之慢查询日志、explain使用详解

这篇文章主要介绍了MySQL SQL性能分析 慢查询日志、explain使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-16

《MySQL高级篇》七、性能分析工具的使用(慢查询日志 | EXPLAIN | SHOW PROFILING | 视图分析 )

📒博客首页:热爱编程的大李子 📒 🌞文章目的:性能分析工具的使用(慢查询日志 | EXPLAIN | SHOW PROFILING | 视图分析 )🌞 ⛅️文章出处:M
2023-08-18

MySQL SQL性能分析之慢查询日志、explain使用的方法是什么

本篇内容介绍了“MySQL SQL性能分析之慢查询日志、explain使用的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!SQL执
2023-04-19

如何使用SQL Server的执行计划分析慢查询

要使用SQL Server的执行计划来分析慢查询,可以按照以下步骤操作:打开SQL Server Management Studio并连接到您的数据库服务器。在查询窗口中输入您想要分析的慢查询,并执行该查询。在查询结果窗口下方的“查询执行计
如何使用SQL Server的执行计划分析慢查询
2024-06-03

编程热搜

目录