当前位置: 首页 > news >正文

2.索引:SQL 性能分析详解

SQL性能分析是数据库优化中重要的一环。通过分析SQL的执行频率、慢查询日志、PROFILE工具以及EXPLAIN命令,能够帮助我们识别出数据库性能的瓶颈,并做出有效的优化措施。以下将详细讲解这几种常见的SQL性能分析工具和方法。


一、SQL 执行频率

SQL执行频率的分析可以帮助我们了解数据库的负载情况,识别高频SQL语句,找出可能的性能瓶颈。

1.1 功能含义

SQL执行频率表示每种类型SQL语句的执行次数。了解这些语句的执行频率有助于优化系统的性能。频繁执行的SQL可能是系统的核心查询,也可能是重复无效的查询。

1.2 查看SQL执行频率的指令

MySQL提供了一系列状态变量,可以用于查看SQL的执行频率。我们可以通过以下命令查看:

SHOW [GLOBAL|SESSION] STATUS LIKE 'Com_%';
如:
show global status like 'Com_______'

此命令会返回当前MySQL实例中每类SQL语句的执行次数。例如:

  • 下面查询 Com_selec为:137次,查询操作偏多
Variable_nameValue
1Com_binlog0
2Com_commit0
3Com_delete2
4Com_import0
5Com_insert3
6Com_repair0
7Com_revoke0
8Com_select137
9Com_signal0
10Com_update0
11Com_xa_end0

注:

  • Com_selectSELECT语句的执行次数
  • Com_insertINSERT语句的执行次数
  • Com_updateUPDATE语句的执行次数
  • Com_deleteDELETE语句的执行次数
1.3 查询内容的含义

这些状态变量显示了不同类型SQL语句的执行频率,有助于我们了解数据库的负载特征。例如,频繁的SELECT语句可能暗示需要优化查询或增加缓存,而频繁的INSERTUPDATEDELETE语句则表明系统中有大量写操作。

1.4 对频率内容进行分析

分析SQL执行频率可以帮助我们识别潜在的性能瓶颈。例如:

  • 高频SELECT:需要检查索引、查询优化和缓存策略;
  • 高频INSERTUPDATE:需要检查事务管理、锁机制和写性能优化;
  • 高频DELETE:可能涉及数据清理策略,需要防止锁竞争和表碎片问题。

二、慢查询日志

慢查询日志用于记录执行时间超过设定阈值的SQL语句,有助于定位低效的查询。

2.1 功能含义

慢查询日志记录了执行较慢的SQL语句。通过分析这些日志,可以找出性能瓶颈并优化查询效率。

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

可以通过以下命令查看是否已启用慢查询日志:

SHOW VARIABLES LIKE 'slow_query_log';

返回结果中,若slow_query_logON,表示慢查询日志已启用。

2.3 设置和开启慢查询日志

若慢查询日志未开启,可用以下命令启用:

SET GLOBAL slow_query_log = 'ON';

设定慢查询的时间阈值,可以通过如下命令调整:

SET GLOBAL long_query_time = 2;  -- 设置为2秒

若需永久生效,可在MySQL配置文件my.cnf中添加以下内容:位置:etc/my.cnf

slow_query_log = ON
long_query_time = 1

如图:
在这里插入图片描述

2.4 查看慢查询日志文件位置

使用以下命令查看慢查询日志文件位置:

SHOW VARIABLES LIKE 'slow_query_log_file';

如:
在这里插入图片描述

2.5 慢查询日志的内容案例

慢查询日志记录了每条慢查询的SQL语句、执行时间、锁等待时间等信息。示例如下:

# Time: 2024-11-08T12:00:00.000000Z
# Query_time: 2.000  Lock_time: 0.000  Rows_sent: 500  Rows_examined: 100000
SELECT * FROM orders WHERE customer_id = 1;

其中:

  • Query_time:查询执行时间。
  • Lock_time:锁等待时间。
  • Rows_sent:返回的行数。
  • Rows_examined:扫描的行数。
  • 以及对应:执行的sql

该示例中的查询扫描了10万行数据,但只返回了500行,可能需要优化。


三、PROFILE

PROFILE工具是MySQL用于分析SQL语句执行过程的性能分析工具,可以显示每个SQL语句在执行的各个阶段所消耗的时间。

3.1 功能含义

PROFILE能够精确到毫秒级别记录SQL执行过程的各个步骤,比如解析、优化、锁等待和执行时间等,有助于精确定位性能瓶颈。

3.2 检查是否支持PROFILE

首先,检查MySQL是否支持PROFILE功能:

SHOW VARIABLES LIKE 'have_profiling';SELECT @@have_profiling ;

若返回值为YES,表示支持PROFILE

注:支持不一定开启了

  1. 检查是否开启:
	SELECT @@profiling

若结果为0,表示没有开启,则需要进行设置开启

  1. 开启PROFILE
	SET profiling = 1;  -- 开启Profiling
3.3 使用PROFILE分析SQL

启用PROFILE并执行分析的步骤如下:


-- 执行待分析的SQL语句
SELECT * FROM orders WHERE customer_id = 1;-- 查看profiling
SHOW PROFILES;-- 查看该语句执行过程的各个阶段时间开销
SHOW PROFILE FOR QUERY 1;

注:在SHOW PROFILE FOR QUERY 1;语句中,1代表执行的第一个查询(按执行顺序排列)。
可以使用以下命令列出所有已执行的查询ID及其执行时间:SHOW PROFILES;

3.4 PROFILE结果的解析

SHOW PROFILE输出示例如下:

StatusDuration
1starting0.0001
2checking permissions0.00002
3Opening tables0.00005
4init0.00003
5optimizing0.00003
6statistics0.00008
7preparing0.00004
8executing0.0015
9Sending data0.0025
10end0.0001
11query end0.00002

各阶段的时间开销有助于我们分析SQL的瓶颈。例如,如果Sending data耗时较长,可能是由于查询结果数据量大、网络延迟等原因所致。


四、EXPLAIN

EXPLAIN命令可以展示MySQL执行查询的计划,帮助分析查询性能和确定优化方向。

4.1 功能含义

EXPLAIN提供了SQL查询的执行计划,展示了MySQL是如何处理查询的,包括使用的索引、扫描行数和连接类型等。通过EXPLAIN结果,可以更好地了解查询的性能情况。

4.2 EXPLAIN的语法

基本语法如下:

EXPLAIN SELECT * FROM orders WHERE customer_id = 1;
4.3 EXPLAIN结果解析

EXPLAIN结果的关键字段说明如下:

字段含义
id查询的执行顺序,id值越大优先级越高,表示先执行。
select_type查询类型(如SIMPLE表示简单查询,PRIMARY表示主查询,SUBQUERY表示子查询)。
table查询的表。
type连接类型,指明表的访问方式,如ALL(全表扫描)、index(索引扫描)、range(范围扫描)、ref(引用索引)。从性能级别来看:null > system > const > eq_ref > ref > range > index > all
possible_keys查询中可能使用的索引。
key实际使用的索引。
key_len使用的索引长度,表示MySQL在查询中实际用到的字节数。
ref显示哪一列或常量与key关联。
rowsMySQL估计查询过程中需要读取的行数。
Extra额外信息,显示MySQL在执行查询时的额外操作,如Using where表示使用了WHERE条件,Using index表示使用覆盖索引。

注:对应type字段:从性能级别来看,null > system > const > eq_ref > ref > range > index > all

相关文章:

2.索引:SQL 性能分析详解

SQL性能分析是数据库优化中重要的一环。通过分析SQL的执行频率、慢查询日志、PROFILE工具以及EXPLAIN命令,能够帮助我们识别出数据库性能的瓶颈,并做出有效的优化措施。以下将详细讲解这几种常见的SQL性能分析工具和方法。 一、SQL 执行频率 SQL执行频率…...

Flink SQL

进入 JobManager 容器: docker exec -it 21442d9ca797 /bin/bash 启动 Flink 的 SQL 客户端: /opt/flink/bin/sql-client.sh embedded 尝试创建 Kafka 表: 在启动的 SQL 客户端中,尝试创建一个 Kafka 表,看看是否能…...

鸿蒙UI开发——实现环形文字

1、背 景 有朋友提问:您好关于鸿蒙UI想咨询一个问题 如果我想实现展示环形文字是需要通过在Text组件中设置transition来实现么,还是需要通过其他方式来实现。 针对这位粉丝朋友的提问,我们做一下解答。 2、实现环形文字效果 ❓ 什么是环形…...

QT版发送邮件程序

简单的TCP邮箱程序 **教学与实践目的:**学会网络邮件发送的程序设计技术。 1.SMTP协议 邮件传输协议包括 SMTP(简单邮件传输协议,RFC821)及其扩充协议 MIME; 邮件接收协议包括 POP3 和功能更强大的 IMAP 协议。 服务…...

JavaSE:初识Java(学习笔记)

java是高级语言的面向对象语言 .[最贴近生活.最快速分析和设计程序] 一,计算机语言发展历史 二,Java体系结构 1,JavaSE(Java Standard Edition) 标准版,定位在个人计算机上的应用 这个版本是Jav…...

ClickHouse创建分布式表

ClickHouse创建分布式表 当数据量剧增的时候,clickhouse是采用分片的方式进行数据的存储的,类似于redis集群的实现方式。然后想进行统一的查询的时候,因为涉及到多个本地表,可以通过分布式表的方式来提供统一的入口。由于是涉及到…...

Flink转换算子

Apache Flink 是一个用于处理无界和有界数据的开源流处理框架。在 Flink 中,转换(Transformation)是数据流处理的核心组件之一,它们定义了如何从输入数据集生成输出数据集。以下是 Flink 中一些常见的转换算子: Map: 将…...

ThinkBook 14+ 2024 Ubuntu 触控板失效 驱动缺失问题解决

首先我的电脑是thinkbook14 2024,从ubuntu18到ubuntu24,笔者整个都试了一遍,触摸板都没反应,确认不是linux系统内核问题,原因为驱动缺失。 解决步骤: (1)下载驱动,网址如…...

【青牛科技】应用方案 | D75xx-150mA三端稳压器

概 述 D75XX系列是一套三端高电流低压稳压器。它们可以提供 150mA 的输出电流和允许输入电压高达30V。它们有几个固定的输出电压范围为3.0 V至5.0 V。CMOS 技术确保低电压降和低静态电流。 虽然这些设备主要设计为固定电压调节器,但它们可以与外部元件一起使用&…...

WPF之iconfont(字体图标)使用

1,前文: WPF的Xaml是与前端的Html有着高度相似性的标记语言,所以Xaml也可同Html一般轻松使用阿里提供的海量字体图标,从而有效的减少开发工作度。 2,下载字体图标: 登录阿里图标库网iconfont-阿里巴巴矢量…...

08、Java学习-面向对象中级:

Java学习第十二天——面向对象中级: IDEA: 创建完新项目后,再src里面创建.java文件进行编写。 src——存放源码文件(.java文件);out——存放编译后的字节码文件(.class文件) 在I…...

springboot集成onlyoffice(部署+开发)

前言 最近有个项目需求是实现前端页面可以对word文档进行编辑,并且可以进行保存,于是一顿搜索,找到开源第三方onlyoffice,实际上onlyOffice有很多功能,例如文档转化、多人协同编辑文档、文档打印等,我们只用…...

LabVIEW编程基础教学(二)--数据类型

在LabVIEW中,数据类型是非常重要的基本概念,因为它们决定了如何存储和操作数据。掌握这些基础数据类型对于编写有效的程序非常关键。以下是LabVIEW中的基础数据类型介绍: 1. 数值类型(Numeric) 整型(Inte…...

「Mac畅玩鸿蒙与硬件29」UI互动应用篇6 - 多选问卷小应用

本篇将带你实现一个多选问卷小应用,用户可以勾选选项并点击提交按钮查看选择的结果。通过本教程,你将学习如何使用 Checkbox 组件、动态渲染列表、状态管理及用户交互,构建完整的应用程序。 关键词 UI互动应用Checkbox 组件状态管理动态列表…...

Flutter中文字体设置指南:打造个性化的应用体验

在使用Flutter进行开发时,可能会遇到中文字体显示不正常或者字体不符合设计需求的情况。Flutter默认的中文字体往往无法满足某些用户对个性化和美观的需求。今天,我们就来详细探讨如何在Flutter应用中设置中文字体,并结合不同场景提供相应的解…...

git下载慢下载不了?Git国内国外下载地址镜像,git安装视频教程

git安装下载的视频教程在这 3分钟完成git下载和安装,git国内外下载地址镜像,Windows为例_哔哩哔哩_bilibili 一、Git安装包国内和国外下载地址镜像 1.1国外官方下载地址 打开Git的官方网站:Git官网下载页面。在页面上选择对应的系统&…...

安卓属性动画插值器(Interpolator)详解

属性动画(Property Animation)是 Android 中一个强大的动画框架,允许开发者对视图的任意属性(如位置、透明度、尺寸、颜色等)进行平滑的动态变化。插值器(Interpolator)作为属性动画的一部分&am…...

OSPF总结

1.定义及相关信息 (1)全称:Open ShortestPath First,开放式最短路径优先 (2)是一种基于链路状态算法的路由协议 (3)目前针对IPv4协议使用的是OSPF Version2(RFC2328) 目前针对IPv6 协议使用的是 OSPF Version3 ( RFC2740 ) (4)运行 OSPF 路由器之间…...

Spring Boot驱动的多维分类知识管理系统

1 绪论 1.1 研究背景 在这个推荐个性化的时代,采用新技术开发一个多维分类的知识管理系统来分享和展示内容是一个永恒不变的需求。本次设计的多维分类的知识管理系统有管理员和用户两个角色。 管理员可以管理用户信息,知识分类,知识信息等&am…...

CSS教程(七)- 背景

介绍 背景属性可以设置背景颜色、背景图片、背景平铺、背景图片位置、背景图像固定等。 1 背景颜色 属性名:background-color 作用:指定HTML元素的背景色。 取值:英文颜色、16进制、rgb、rgba、transparent(一般为透明&#…...

无法与IP建立连接,未能下载VSCode服务器

如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

数据链路层的主要功能是什么

数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、👨‍🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨‍&#x1f…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...