当前位置: 首页 > 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


http://www.mrgr.cn/news/69192.html

相关文章:

  • 软件设计师-软件工程
  • OSError: [Errno 22] Invalid argument: ‘D:\\Desktop\\S\\SMTRY2\r.txt‘
  • 怎么做扫码的视频播放效果?视频制作二维码的3步简单教程
  • windows和git不区分文件名大小写问题
  • UNIX网络编程-TCP套接字编程(实战)
  • 什么是量化交易
  • 公司文件防止泄密的方式(如何防止技术泄密)?5个防泄密措施,请谨记!
  • 操作系统(11) (POSIX--Linux线程编程---Mutex互斥锁语法应用)
  • 临床检验方法与仪器 第一部分作业:光谱分析仪器与技术的总结与归纳+新型光谱仪的调研
  • Python学习从0到1 day26 第三阶段 Spark ① 数据输入
  • 在Rocky Linux 9上快速安装Nginx
  • Docker基础(一)
  • 深度学习基础—了解词嵌入
  • 基于Video-ReTalking的AI数字人模型部署
  • CSS-盒模型
  • Linux——入门
  • 拓扑排序(C++类封装+数组模拟队列和邻接表)
  • of 操作函数——获取设备树节点
  • 概念井喷时代:什么样的产品才是真正的云产品?哪一些在浑水摸鱼
  • JS 循环语句
  • sql注入绕过,超详细!!
  • 力扣题库——75.颜色分类
  • 计算结构加法3+2
  • java.lang.NoClassDefFoundError: org/springframework/aot/AotDetector问题解决
  • 提升内容质量的五大关键策略
  • 家用云相册方案探索之Immich