MySQL高级(归纳五)之 查询截取分析(Show Profile、日志、存储过程)

本文详细介绍了MySQL的慢查询日志分析,包括如何开启、设置阈值及查看慢查询记录。同时,讲解了日志分析工具mysqldumpslow的使用,以及ShowProfile功能来分析SQL执行的资源消耗。最后提到了全局查询日志的配置和批量插入数据的实践案例,是数据库性能优化的重要参考。
摘要由CSDN通过智能技术生成

MySQL高级篇五 日志分析


一、慢查询日志

1.1、简介

  • MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
  • 具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10秒以上的语句。
  • 由他来查看哪些SQL超出了我们的最大忍耐时间值,比如一条sql执行超过5秒钟,我们就算慢SQL,希望能收集超过5秒的sql,结合之前explain进行全面分析

1.2、使用

说明:

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

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

1.2.1、查看是否开启

  1. 默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,
  2. 可以通过设置slow_query_log的值来开启

查看是否开启(默认 OFF

SHOW VARIABLES LIKE '%slow_query_log%';

在这里插入图片描述

1.2.2、如何开启慢日志功能(临时)

01 开启命令:

set global slow_query_log=1;

使用set global slow_query_log=1开启了慢查询日志只对当前数据库生效
如果MySQL重启后则会失效

02 设定超时时间:(全局变量设置,对当前连接不影响)

# 设置超时时间为1秒,sql执行超过1秒就会被捕获
set global long_query_time=1

在这里插入图片描述
03 对当前连接立刻生效

# 设置超时时间为1秒,sql执行超过1秒就会被捕获
set session long_query_time=1.0

在这里插入图片描述

1.2.3、如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此)

  1. 关于慢查询的参数slow_query_log_file ,它指定慢查询日志文件的存放路径,系统默认会给一个缺省的文件host_name-slow.log(如果没有指定参数slow_query_log_file的话)
  2. 说白点就是你没取文件名默认就是host_name-slow.log

修改my.cnf文件,[mysqld]下增加或修改参数

 #开启慢日志功能
slow_query_log =1

 # 指定慢日志数据记录的文件
slow_query_log_file=/var/lib/mysql/xxx.log

然后重启MySQL服务器。

1.2.4、什么数据会被记录

  1. 我们设置超时时间为2秒的话
  2. 如果sql执行时间超过2秒就会被记录下来
  3. 等于或者小于超时时间就不会被记录

1.2.5、归纳使用

01 查看当前多少秒算慢

SHOW VARIABLES LIKE 'long_query_time%';

02 设置慢的阙值时间

set global long_query_time=1

这边的问题:为什么设置后看不出变化?

  1. 方法一:需要重新连接或新开一个会话才能看到修改值。 SHOW VARIABLES LIKE ‘long_query_time%’;
  2. 方法二:或者通过set session long_query_time=1来改变当前session变量;

03 记录慢SQL并后续分析

实验一条慢sql
在这里插入图片描述
跟踪日志信息
在这里插入图片描述
04 查询当前系统中有多少条慢查询记录

show global status like '%Slow_queries%';

在这里插入图片描述

1.3、使用【mysqld】下配置:

全局配置,不是很推荐,建议采用临时的

# 开启慢日志功能
slow_query_log=1;
# 慢日志的文件,不指定的话,系统会默认生成一个
slow_query_log_file=/var/lib/mysql/xxxx.log
# 设置超时时间
long_query_time=3;
#log_output='FILE'表示将日志存入文件,默认值是'FILE' log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中.
log_output=FILE

二、日志分析工具mysqldumpslow

2.1、查看mysqldumpslow的帮助信息

mysqldumpslow --help

在这里插入图片描述
参数说明:

  1. s: 是表示按照何种方式排序;
  2. c: 访问次数
  3. l: 锁定时间
  4. r: 返回记录
  5. t: 查询行数
  6. al:平均锁定时间
  7. ar:平均返回记录数
  8. at:平均查询时间
  9. t:即为返回前面多少条的数据
  10. g:后边搭配一个正则匹配模式,大小写不敏感的

2.2、常用的4种

01 得到返回记录集最多的10个SQL

mysqldumpslow -s r -t 10 /var/lib/mysql/xxx.log

02 得到访问次数最多的10个SQL

mysqldumpslow -s c -t 10 /var/lib/mysql/atguigu-slow.log

03 得到按照时间排序的前10条里面含有左连接的查询语句

mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/xxx.log

04 另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现爆屏情况(数据过多,刷刷刷的那种)

mysqldumpslow -s r -t 10 /var/lib/mysql/atguigu-slow.log | more

三、Show Profile介绍

3.1、说明:

官网入口

  1. mysql提供可以用来分析当前会话中语句执行的资源消耗情况。
  2. 可以用于SQL的调优的测量
  3. 默认情况下,参数处于关闭状态,并保存最近15次的运行结果

3.2、使用流程:

01 是否支持,看看当前的mysql版本是否支持

# 默认是关闭,默认是OFF
Show  variables like 'profiling';

02 开启功能,默认是关闭,使用前需要开启

#查看 默认是OFF
show variables like 'profiling';

# 开启功能 ON
set profiling=1;

03 有SQL在运行, Show Profile就会帮我们分析

04 查看结果

#查看全部
show profiles;

在这里插入图片描述
04 查看结果之指定sql(用Query_ID)

# 号码是Query_ID
show profile cpu,block io for query  号码;

#例如:
show profile cpu,block io for query 9;

例如:
在这里插入图片描述
04 参数说明:

参数说明
ALL显示所有的开销信息
BLOCK IO显示块IO相关开销
CONTEXT SWITCHES上下文切换相关开销
CPU显示CPU相关开销信息
MEMORY显示内存相关开销信息
PAGE FAULTS显示页面错误相关开销信息
SOURCE显示和Source_function,Source_file,Source_line相关的开销信息
SWAPS显示交换次数相关开销的信息

3.3、出现的参数说明:

  1. converting HEAP to MyISAM ⇒ 查询结果太大,内存都不够用了往磁盘上搬了。
  2. Creating tmp table ⇒ 是创建临时表很损耗性能(先拷贝数据到临时表,用完再删除)
  3. Copying to tmp table on disk ⇒ 把内存中临时表复制到磁盘,危险!!!
  4. locked 数据库锁的因素

四、全局查询日志

尽量不要在生产环境开启这个功能,每条sql都记录起来,超级损耗性能

4.1、配置启用(方式一)

在mysql的my.cnf中,设置如下:

#开启
general_log=1   
# 记录日志文件的路径
general_log_file=/path/logfile
#输出格式
log_output=FILE

4.2、编码启用(方式二)

# 1启动
set global general_log=1;
 
# 2存入表中 。全局日志可以存放到日志文件中,也可以存放到Mysql系统表中。存放到日志中性能更好一些,存储到表中
set global log_output='TABLE';
 
# 3查看 。此后,你所编写的sql语句,将会记录到mysql库里的general_log表,可以用下面的命令查看 
select * from mysql.general_log;

五、批量插入数据案例



待补充



上一篇:MySQL高级(归纳四)之sql性能调优分析与详解

下一篇:MySQL高级(归纳五)之数据库锁的分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

suqinyi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值