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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Go语言编写一个简单的NTP服务器

NTP服务介绍 NTP服务器【Network Time Protocol(NTP)】是用来使计算机时间同步化的一种协议。 应用场景说明 为了确保封闭局域网内多个服务器的时间同步,我们计划部署一个网络时间同步服务器(NTP服务器)。这一角色将…

深度学习经典模型之VGGNet

1 VGGNet 1.1 模型介绍 ​ VGGNet是由牛津大学视觉几何小组(Visual Geometry Group, VGG)提出的一种深层卷积网络结构,他们以7.32%的错误率赢得了2014年ILSVRC分类任务的亚军(冠军由GoogLeNet以6.65%的错误率夺得)和…

Android的BroadcastReceiver

1.基本概念:BroadCast用于进程间或者线程间通信 本质上是用Binder方法,以AMS为订阅中心,完成注册,发布,监听的操作。 2.简单实现的例子 package com.android.car.myapplication;import android.content.BroadcastRe…

分布式数据库中间件mycat

MyCat MyCat是一个开源的分布式数据库系统,它实现了MySQL协议,可以作为数据库代理使用。 MyCat(中间件)的核心功能是分库分表,即将一个大表水平分割为多个小表,存储在后端的MySQL服务器或其他数据库中。 它不仅支持MySQL&#xff…

Java多线程编程(四)- 阻塞队列,生产者消费者模型,线程池

目录: 一.阻塞队列 二.线程池 一.阻塞队列 1.阻塞队列是⼀种特殊的队列. 也遵守 "先进先出" 的原则 阻塞队列能是⼀种线程安全的数据结构, 并且具有以下特性: 1.1.当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素 1.…

深度剖析JUC中LongAdder类源码

文章目录 1.诞生背景2.LongAdder核心思想3.底层实现:4.额外补充 1.诞生背景 LongAdder是JDK8新增的一个原子操作类,和AtomicLong扮演者同样的角色,由于采用AtomicLong 保证多线程数据同步,高并发场景下会导致大量线程同时竞争更新…

大数据面试题--kafka夺命连环问

1、kafka消息发送的流程? 在消息发送过程中涉及到两个线程:一个是 main 线程和一个 sender 线程。在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给双端队列,sender 线程不断从双端队列 RecordAccumulator 中拉取…

树形结构数据

树形结构数据 树形结构数据是一种基础且强大的数据结构,广泛应用于计算机科学和软件开发的各个领域。它模拟了自然界中树的层级关系,通过节点和它们之间的连接来组织数据。在本文中,我们将深入探讨树形结构数据的概念、特点、类型以及它们在…

dell服务器安装ESXI8

1.下载镜像在官网 2.打开ipmi(idrac),将esxi镜像挂载,然后服务器开机 3.进入bios设置cpu虚拟化开启,进入boot设置启动选项为映像方式 4..进入安装引导界面3.加载完配置进入安装 系统提示点击继 5.选择安装磁盘进行…

信息安全数学基础(46)域和Galois理论

域详述 定义: 域是一个包含加法、减法、乘法和除法(除数不为零)的代数结构,其中加法和乘法满足交换律、结合律,并且乘法对加法满足分配律。同时,域中的元素(通常称为数)在加法和乘法…

Windows端口占用/Java程序启动失败-进程占用的问题解决

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Python酷库之旅-第三方库Pandas(204)

目录 一、用法精讲 951、pandas.IntervalIndex.values属性 951-1、语法 951-2、参数 951-3、功能 951-4、返回值 951-5、说明 951-6、用法 951-6-1、数据准备 951-6-2、代码示例 951-6-3、结果输出 952、pandas.IntervalIndex.from_arrays类方法 952-1、语法 952…

AndroidStudio-文本显示

一、设置文本的内容 1.方式&#xff1a; &#xff08;1&#xff09;在XML文件中通过属性&#xff1a;android:text设置文本 例如&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.andr…

微星爆破弹ddr4wifi接线梳理研究

主板(微星爆破弹ddr4 wifi) mac用久了&#xff0c;windows的键盘都有点不习惯了。 理清了这些接口都是干啥的&#xff0c;接线就非常简单了。

机器视觉基础—双目相机

机器视觉基础—双目相机与立体视觉 双目相机概念与测量原理 我们多视几何的基础就在于是需要不同的相机拍摄的同一个物体的视场是由重合的区域的。通过下面的这种几何模型的目的是要得到估计物体的长度&#xff0c;或者说是离这个相机的距离。&#xff08;深度信息&#xff09…

【GPTs】EmojiAI:轻松生成趣味表情翻译

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;GPTs指令&#x1f4af;前言&#x1f4af;EmojiAI主要功能适用场景优点缺点 &#x1f4af;小结 &#x1f4af;GPTs指令 中文翻译&#xff1a; 此 GPT 的主要角色是为英文文本提供幽默…

「C/C++」C/C++STL 之 push_back 和 emplace_back 的区别

✨博客主页何曾参静谧的博客📌文章专栏「C/C++」C/C++程序设计📚全部专栏「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明目…

【Golang】Go语言教程

Go语言教程 文章目录 Go语言教程一、Go语言教程二、Go语言特色三、Go语言用途四、第一个Go程序六、运行代码的两种方式七、go run和go buil的区别7.1、go run7.2、Go build 一、Go语言教程 Go全称Golang Go是一个开源的编程语言&#xff0c;它能让构造简单、可靠且高效的软件变…

揭秘云计算 | 2、业务需求推动IT发展

揭秘云计算 | 1、云从哪里来&#xff1f;-CSDN博客https://blog.csdn.net/Ultipa/article/details/143430941?spm1001.2014.3001.5502 书接上文&#xff1a; 过去几十年间IT行业从大型主机过渡到客户端/服务器&#xff0c;再过渡到现如今的万物互联&#xff0c;IT可把控的资…