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

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.kler.cn/a/387541.html

相关文章:

  • 43.第二阶段x86游戏实战2-提取游戏里面的lua
  • Java-Redisson分布式锁+自定义注解+AOP的方式来实现后台防止重复请求扩展
  • LED和QLED的区别
  • 手动实现h5移动端点击全屏按钮横屏展示图片,左右滑动切换,处理页面会随着手指滑动问题
  • html+js+css实现拖拽式便签留言
  • SpringBoot整合Freemarker(三)
  • Intel AMT技术在服务器硬件监控中的应用与解读
  • C语言--结构体详解
  • Ubuntu下如何管理多个ssh密钥
  • OSPF总结
  • Django 详细入门介绍
  • 使用Rust实现http/https正向代理
  • 动态规划 —— dp 问题-买卖股票的最佳时机含手续费
  • linux opp 模块
  • 深入解析 Transformers 框架(四):Qwen2.5/GPT 分词流程与 BPE 分词算法技术细节详解
  • JavaEE初阶---properties类+反射+注解
  • EasyUI弹出框行编辑,通过下拉框实现内容联动
  • go生成4位随机数字
  • 深入了解决策树:机器学习中的经典算法
  • 如何使用HighBuilder前端开发神器
  • ThingsBoard规则链节点:RPC Call Reply节点详解
  • Python的函数
  • 第一部分 Supervised Machine Learning: Regression and Classification
  • 嵌入式系统与机器学习的结合
  • oracle使用CTE递归分解字符串
  • python - leetcode【数据结构-算法】-入门/通关手册