【MySQL数据库 | 第十九篇】SQL性能分析工具

news2024/9/27 19:24:27

目录

前言:

SQL执行频率:

慢查询日志:

profile:

profile各个指令:

总结:


前言:

        本篇我们将为大家讲解SQL性能的分析工具,而只有熟练的掌握了性能分析的工具,才可以更好的对SQL语句进行优化。虽然我们在自己练习的时候对这种优化感知并不明显,但是如果我们要处理几千几万条数据,那么这种优化带来的感知就会很强,因此我们要学好SQL语句的性能分析的工具,熟练掌握SQL的优化,才可以更加有把握解决现实生活中的实际问题

SQL执行频率:

        SQL执行频率是指在一定时间范围内某个SQL语句在数据库中被执行的次数。SQL执行频率的高低可以反映出该语句在实际业务中的重要性和影响力。

        对于一个复杂的应用系统,其数据库中可能存在大量的SQL语句,有些语句在实际使用中频率较高,有些则可能很少使用或者仅用于特定情况。对于频率较高的SQL语句,如果它们的执行效率低下,可能会导致数据库性能下降,影响整个系统的运行效率。

        因此,在进行SQL优化时,从SQL执行频率的角度出发,通常会优先考虑优化那些执行频率较高的查询语句。这些查询语句可能涉及到的数据表和字段也是比较重要的,需要认真进行索引设计和数据库结构优化。

        同时,SQL执行频率也可以作为数据库性能监控的一个指标。通过对SQL执行频率的监控、统计和分析,可以及时发现系统中执行频率较高的SQL语句,定位并解决数据库性能问题。

查询方法:
        MySQL客户端连接成功之后,通过 show [session | global] status 命令可以提供服务器状态信息,通过如下指令就可以当前数据库中 INSERT , UPDATE ,  DELETE , SELECT 的访问频次:

SHOW GLOBAL STATUS LIKE 'COM_______';

补充概念:服务器状态信息

        MySQL服务器状态信息是指数据库服务器当前的状态信息,包括各种性能指标、资源使用情况、连接信息、缓存和锁状态等。通过查看这些状态信息,可以了解数据库服务器的工作状态、瓶颈问题和性能瓶颈等,帮助我们进行系统优化和调整。

我们在 DataGrip 中进行查询:

 这些查询结果分别为:

  • Com_binlog:   执行 BINLOG 操作的次数,即写二进制日志的次数;
  • Com_commit: 执行 COMMIT 操作的次数,即提交事务的次数;
  • Com_delete:   执行 DELETE 操作的次数,即删除数据的次数;
  • Com_import:   执行 LOAD DATA 导入数据的次数;
  • Com_insert:    执行 INSERT 操作的次数,即插入数据的次数;
  • Com_repair:    执行 REPAIR TABLE 修复表的次数;
  • Com_revoke:  执行 REVOKE 操作的次数,即取消授权的次数;
  • Com_select:   执行 SELECT 操作的次数,即查询的次数;
  • Com_signal:   执行 SIGNAL 操作的次数;
  • Com_update: 执行 UPDATE 操作的次数,即更新数据的次数;
  • Com_xa_end:执行 XA END 操作的次数,即提交分布式事务的次数。

这些命令在 MySQL 中具有不同的作用和用途,通过统计执行这些命令的次数,可以更加全面地了解 MySQL 服务器的工作状态和性能瓶颈,从而进行数据库性能优化和故障排查。

 tips:

在 MySQL 中,执行一次 SELECT 查询语句会生成多个命令请求,包括 Com_select、Handler_read_key、Handler_read_first、Handler_read_next 等。这些命令请求都会被累加到相应的命令计数器中。

如果在执行一次 SELECT 查询语句后,该命令计数器的值会增加 n,这是因为生成了 n 个命令请求。因此,如果你在 DataGrip 中执行多次 show global status 命令,每次命令执行都会使 com_select 计数器的值增加 n。

通过查询指令,我们可以快速的知道目前数据库哪些类型的语句占据数据库的绝大部分,也就确定了优先优化目标。 

那我们知道了优化的主要目标是哪类语句,我们又如何找出要对这类语句中的哪些语句进行优化呢?我们可以采用慢查询日志

慢查询日志:

        慢查询日志(slow query log)是 MySQL 中的一项功能,用于记录执行时间超过特定阈值的 SQL 语句的日志。慢查询日志包括每个 SQL 语句的执行时间、扫描的行数、使用的索引、执行的方式等信息。通过分析慢查询日志,可以定位数据库的性能问题,优化查询语句或数据库结构来提升系统性能。

        MySQL 提供了配置慢查询日志的相关参数,包括慢查询阈值、慢查询日志文件名、日志格式等。

        默认情况下,MySQL 没有开启慢查询日志。(这里是基于linux的,Linux会自动关闭)需要在 MySQL 配置文件(/ect/my.cnf)中设置 slow_query_log 参数为 ON,以开启慢查询日志的记录。另外,还需要设置 long_query_time 参数为一个时间阈值,单位为秒当 SQL 查询的执行时间超过该阈值时,MySQL 会将该查询记录到慢查询日志中。

        通过慢查询日志,可以对具体的 SQL 查询语句进行性能分析和优化。一些常见的优化手段包括:修改查询语句的语法;创建或修改索引;优化表结构等。除此之外,还可以利用慢查询日志来监控数据库系统的性能瓶颈,分析表负载、索引使用情况、数据分布等方面的信息,以进一步完善数据库的性能和可用性。

检查慢查询日志是否开启:

SHOW VARIABLES LIKE 'SLOW_QUARY_LOG';

运行结果:

 没有开启的需要在Datagrip中配置如下信息:

SET GLOBAL slow_query_log = 1;  # 开启慢查询日志

SET GLOBAL long_query_time = 1;  # 设置慢查询阈值为 1 秒钟

设置慢查询阈值的意义是:只要待查询的语句超过了设定阈值,我们就会把他记入慢查询日志之中,供后续我们进行针对优化。
开启之后我们可以看到

 第一个是确定慢查询表已经开启记录,第二个则是告诉我们慢查询的表名。

那么我们可以直观的在文件资源管理器中查看慢查询表:

 点击进入Data:

 这个就是我们的慢查询表。

需要注意的是Data基本上都会被隐藏,需要我们先对这个文件以管理员模式进行访问,如果还是不显示的话,我们就在MySQL客户端执行这条语句

 SELECT @@datadir;

点击执行后,运行结果就是Data的地址,我们直接访问就可以了

 

慢查询表:

 我们尝试执行这样一句:

select sleep (10);

执行结束后,我们查看慢查询表:

 我们可以看到有关于这条语句的执行用户,使用的哪一个数据库,以及执行的语句都会被记录下来。

profile:

MySQL的`PROFILE`是一个可以用来分析执行查询语句的工具。它可以让我们更好地了解查询执行过程中的各种时间和资源开销,包括:

  • 1. 执行查询语句所需的时间
  • 2. 查询语句返回的行数和大小
  • 3. 系统在执行查询语句时所使用的资源,如CPU时间、磁盘和内存使用情况等

使用`PROFILE`可以帮助我们优化查询语句,发现慢查询问题,以及更好地了解MySQL数据库引擎执行查询的方式。

简单的来讲,使用profile可以告诉我们具体的每一条语句耗时多少,具体耗时在哪个环节,让我们可以做出更加具体的优化。

但是在使用之前,我们还要查询当前的MySQL是否支持profile

select @@have_profiling;

 通过查询我们可以看到目前是支持profile的,而默认情况下profile是关闭的,因此我们再次执行语句,查询当前profiling是否开启:

select @@profiling;

于是我们调用下面的语句开启profiling

set profiling =1;

运行结果:

profile各个指令:

1.查看每一条SQL的耗时基本情况

show profiles;

2.查看指定query_id的SQL语句的各阶段耗时:

show profile for query query_id;

3.查看指定query_if的SQL语句CPU使用情况:

show profile cpu for query query_id;

我们用语句1来举一个例子:

我们执行语句:

select name from emp where id =1;

show profiles ;

 这段SQL语句的作用大致如下:

1. 第一行查询上一个查询语句的执行结果中是否包含警告信息。
2. 第二行查询当前所在的数据库名称。
3. 第三行和第四行都是执行`SHOW WARNINGS`,查询语句是否产生了警告信息。
4. 第五行和第六行分别设置`net_write_timeout`和`SQL_SELECT_LIMIT`的值。
5. 第七行查询`emp`表中`id`为1的员工的姓名。
6. 第八行和第九行查询当前会话的事务隔离级别。
7. 第十一行将当前会话的事务隔离级别设置为读写模式。
8. 第十三行查询当前会话的事务隔离级别是否被设置为只读模式。
9. 第十四行和第十五行执行`SHOW WARNINGS`语句查询语句是否产生了警告信息。
10. 第十六行和第十七行都是重新设置`net_write_timeout`和`SQL_SELECT_LIMIT`的默认值。

总之,`SHOW WARNINGS`语句可以用来查看最后一次执行的查询语句是否产生了警告信息,警告信息可以包括查询语句执行过程中产生的一些异常和错误信息。

总结:

        本篇我们讲解如何利用 SQL执行频率,查询慢日志,profile来确定需要对哪些句子进行优化他们分别起到了:哪一部分需要被优化,哪些语句需要被优化,如何对语句进行更具体的优化的作用,但这三个也只是从时间角度粗略的评判哪些语句需要被优化,而下一篇我们将会讲解explain,他提供了查看执行计划的功能,在实际生活中我们也经常通过它来评判语句性能,因此大家要做好准备,熟练的掌握这一篇的内容,充满信心的学习下一篇章。

如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/656948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM知识点整理

JVM 回收哪个区域?关联面试题:fullgc会回收方法区(元空间)吗? 怎么判断对象可以被回收了关联面试题:哪些对象可以作为 GC Root (两栈两方法) JVM GC什么时候执行?分代回收机制思考&…

pandas---文件读取与存储(csv、hdf、json、excel、sql)

数据大部分存在于文件当中,所以pandas会支持复杂的IO操作,pandas的API支持众多的文件格 式,如CSV、SQL、EXCEL、JSON、 HDF5。 1. csv文件 pandas.read_csv(filepath_or_buffer, sep ,, usecols ) filepath_or_buffer:文件路径 sep :…

简要介绍 | 强化学习:从原理到应用

注1:本文系“简要介绍”系列之一,仅从概念上对强化学习进行非常简要的介绍,不适合用于深入和详细的了解。 注2:"简要介绍"系列的所有创作均使用了AIGC工具辅助 强化学习:从原理到应用 1. 背景介绍 强化学习…

手撕学生管理系统超详解——【c++】

题目要求:设计一个学生成绩管理程序,实现按班级完成对学生成绩信息的录入和修改,并用文件保存。 实现按班级输出学生的成绩单;实现按学号和姓名进行查询,按平均成绩进行排序功能。 问题描述 该程序的目标是提供一个简单且易于使用…

scratch lenet(2): C语言实现图像直方图的计算

scratch lenet(2): C语言实现图像直方图的计算 1. 目的 用 C 语言实现 uint8 类型图像(单通道)的直方图计算。不涉及直方图均衡化。 2. 什么是图像直方图 2.1 统计得到图像直方图 通常是对于单通道的灰度图而言的。像素范围是 [0, 255], 统计每个像…

提高错误日志处理效率!使用Python和钉钉机器人实现自动告警聚合

1、背景 日志是非常重要的信息资源。它们记录了应用程序的运行状态、错误和异常情况,帮助我们了解系统的健康状况以及发现潜在的问题。为了高效地管理和分析日志数据,许多组织采用了Elasticsearch、Logstash和Kibana(ELK)堆栈作为…

Eclipse Krazo(Jakarta MVC)的使用

文章目录 背景Jakarta MVC规范Eclipse Krazo使用前的思考全局配置Controller示例返回View的三种写法View中用到的Model如何设值?View中如何获取Model中的值? 参数校验防止CSRFKrazo是如何实现的呢?如何生成csrf的token?如何校验cs…

开源赋能,决胜未来 — 参加原子全球开源峰会有感

目录 文章目录 目录前言开源决胜未来:闭源摧毁 UNIX,开源成就 Linux开源创新:软硬件协同,共建开源生态 前言 开源原子基金会作为国内首家开源基金会组织,由其主办的首届 “开放原子全球开源峰会” 也是第一次被冠以 “…

干货文:Mac 中 .bash_profile 和 .zshrc 的区别

如果你想在 Mac OS 中配置 MySQL 的环境变量,在 .zshrc 文件中添加如下内容: # 设置 mysql 的路径 export MYSQL_HOME/usr/local/mysql/bin# 将 MYSQL_HOME 添加到 PATH 中 export PATH$HOME/bin:/usr/local/bin:$MYSQL_HOME:$PATH# 解决需要 source 才…

硬件【9】详解二极管钳位电路

文章目录 1 概述1.1 正向钳位电路1.2 偏置正向钳位电路 1 概述 在之前的 二极管限幅电路 一文中,我们学习了二极管限幅电路,该电路可以削掉一部分信号,但不会影响剩余信号。今天,我们将学习另一种基于二极管的电路,该…

搭建环境【2】windows主机和ubuntu互传文件的4种方法

我的ubuntu系统是安装在 VMware 虚拟机中的,两者之间经常要互传文件,下面介绍4种常用的互传文件方法。 1. 共享文件夹方式互传 在虚拟机中需要开启共享文件夹的功能。首先虚拟机中的ubuntu要求是已经开机了的状态,然后进行设置:…

Vue2封装一个全局通知组件并发布到NPM

✍🏼作者:周棋洛,计算机学生 ♉星座:金牛座 🏠主页:点击查看更多 🌐关键:vue2 组件封装 npm发包 文章目录 1. 前言 🍃2. 我为什么要封装通知插件 ❓3. 初始化vue空项目 &…

B047-cms02-高级查询 删除 添加 修改

目录 高级查询页面准备下拉框显示文章类型ArticleController用jstl和el表达式取值展示 高级查询参数ArticleQuery 高级查询页面发送请求导入jquery.jdirk.js在jquery下引用绑定按钮发送请求高级查询sql 绑定删除事件绑定事件拿到标签id值准备模态框来自xmind弹出删除模态框绑定…

matlab不显示子图刻度并调整子图间距

matlab中在使用subplot函数画图时,尤其是做emd分解查看IMF时, 正常画图的代码及结果如下: figure for i 1:size(imf_norm,1)subplot(7,1,i)plot(imf_norm(i,:))ylabel(IMFstring(i)) end其中imf_norm为分解得到的imfs 效果图: …

python里apply用法_Python apply函数的用法

Python编程语言Python 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。Python语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的…

HDL抽象等级 仿真模型 网表 delay speicfy与sdf

1.HDL 硬件描述语言 抽象分级 HDL这里主要说verilog 在描述硬件电路时分为三个抽象级别 行为级模型:主要用于test bench,着重系统行为和算法,不在于电路实现,不可综合(常用描述有initial,fork/join&#…

【MYSQL】MYSQL应用环境,系统特征,储存引擎,应用框架和索引功能的详细讲解

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: 七七的闲谈 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖&#x1f…

DINO-DETR匈牙利匹配与加噪过程学习记录

今天再来回顾一下DINO中匈牙利匹配与损失函数部分,该部分大致与DETR相似,却又略有不同。 为了查看数据方便,博主将num_query改为20,max_select值也为20。 匈牙利匹配过程 首先是数据送入匈牙利匹配中进行标签匹配过程了。 获取…

qt.qpa.plugin: Could not load the Qt platform plugin “xcb“ in

兄弟们看看是不是这个错: QObject::moveToThread: Current thread (0xe5205f0) is not the objects thread (0xa14d0f0). Cannot move to target thread (0xe5205f0)qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/xxx/python3.…

Esp32+Blynk实现云端控制LED开灭

目录 环境配置依赖库安装blynk 基础设置 GPIO 点灯实验 环境配置 依赖库安装 参考 blynk 官方快速上手文档 如果要使用 blynk 提供的环境,我们就必须安装对应的库 选择基于 blynk 且适用于 ESP32 的库并安装到 arduino 上: blynk 基础设置 进入官网并且…