分享免费的编程资源和教程

网站首页 > 技术教程 正文

用explain和 profifile 分析SQL

goqiw 2024-11-23 15:14:38 技术教程 8 ℃ 0 评论

一、explain

explain主要是用于分析我们执行的SQL语句,分析的信息主要包括:索引的使用、连接方式、是否全表扫描等相关信息。

explain语法如下:

explain 语句
例如:
EXPLAIN SELECT * FROM ecs_goods

explaint执行的结果如下:



1.id

表示执行语句的id号,只是用来标识SQL语句的,如果越小说明执行的SQL语句的优先级越高。

2.select_type

表示查询的子类型

---->SIMPLE:表示简单的查询语句,不包括任何子查询或者union语句 ---->PRIMARY:如果查询语句中包含复杂子查询,那最外部的子查询会被标识为primary ---->UNION:表示查询语句包含链接的语句

---->DEPENDENT UNION:表示第二个或外部select使用union

---->UNION RESULT:表示链接的结果

---->SUBQUERY:表示包含子查询

---->DEPENDENT SUBQUERY:与SUBQUERY子查询意思相同

3.table

表示查询过程使用到的表名

4.type

表示对表进行扫描的类型,通常包括的类型有:ALL、 index、range、ref、eq_ref、const、system、NULL

---->ALL:全表扫描,在进行查询的时间最不希望看到的是全表扫描

---->index:索引扫描,索引其实也是全表扫描,索引表一般都是进行排序过的

---->range:表示一个范围,指的索引表的范围

---->ref:表示关联的匹配条件是来自于一个索引列上的值,或者说一个固定值范围

---->eq_ref:表示取索引列中的值是唯一的

---->const:表示匹配的值是一个来自常量的值

5.key

表示使用到的关键字或关键列

6.key_len

表示索引列所占的字节数,这个这个值无法精确的计算,但是可以肯定是这个值越小越好,说明执行语句时所消耗的PCU和IO的资源一定会更小。

7.ref

表示匹配条件时使用到的索引列

8.rows

表示匹配到的行数

9.extra

表示其它的相关信息

二、 profifile

profifile工具主要是用于分析SQL执行所消耗的响应时间和系统资源。

查看profifille是否开启

SHOW VARIABLES LIKE '%profil%'
如果profiling的值为OFF,表示这个功能未开启
那可以通过设置将这个功能开启

set proiling = ON

profifile的语法如下:

SHOW PROFILE [type [, type] ... ]
[FOR QUERY n]
[LIMIT row_count [OFFSET offset]]

type表示我们要分析资源的类型:

---->ALL ---->BLOCK IO ---->CONTEXT SWITCHES ---->CPU ---->IPC ---->MEMORY ---->PAGE FAULTS ---->SOURCE ---->SWAPS



for query -n表示只分析单个SQL语句,n表示query_id

如果分析所有的检索语句

show profilies

分析结果中横栏各列表示的意思如下:

---->status:显示一条SQL语句在后面执行的整个过程

---->Duration:表示执行的时间

---->CPU_user:用户消耗CPU资源

---->CPU_system:系统消耗CPU资源

---->Context_voluntary:上下文主动切换

---->Context_involuntary:上下文被动切换

---->Block_ops_in:阻塞的输入操作

---->Block_ops_out:阻塞的输出操作

---->Messages_sent:消息发出

---->Messages_received:消息接受

---->Page_faults_major:主分页错误

---->Page_faults_minor:次分页错误

---->Swaps:交换次数

---->Source_function:源功能

---->Source_fifile:调用的源文件

---->Source_line:源代第多少行代码

在分析所消耗的资源时,主要分析的对象包括CPU、Context_switch、IO三个指标

Context switch表示上下文切换,上下文切换是指是CPU从一个进程(线程)切换到另一个进程(线程)。进程是正在执行的一个程序的实例,在Linux中,线程可以算作轻量级进程,线程可以并发执行,并且同一进程创建的线程可以共享同一片地址空间及其它资源,即该进程的进程地址空间及属于该进程的其它资源。

通常以下情况会出上下文切换:

1.nice的值的变化,导到上下文切换

2.任务被系统强制挂起

3.开发者强制进行上下文切换

4.当IO阻塞,IO阻塞会导致IO不断的请求CPU资源,CPU必须不断进行上下文切换来解决阻塞的问题。

当上下文切换变得很频繁时,一般就会导致CPU的使用率上升,原因是因为当上下文切换频繁后,CPU或者说任务必须在寄存器与cache中进行来回的工作与切换。

监控上文切换的指标的相关命令:sar、vmstat、iostat

分析结果中队中每行数据的含义:

---->initializtion:初始化

---->checking query cache for query:检查缓存查询

---->starting:开始

---->checking permissions:检查权限

---->Opening tables:打开表

---->init :初始化

---->System lock :系统锁

---->Table lock:表锁

---->optimizing :优化

---->statistics:统计

---->preparing :准备

---->executing:执行

---->Sending data:发送数据

---->Sorting result:排序

---->end :结束

---->query end :查询 结束

---->closing tables :关闭表 /去除TMP 表

---->freeing items :释放物品

---->cleaning up :清理

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表