Mysql执行过程及顺序

Posted 方片四

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql执行过程及顺序相关的知识,希望对你有一定的参考价值。

一、执行过程

Mmysql整体的执行过程如下图所示:

 


1. 连接器主要职责:

Ø 负责与客户端的通信,是半双工模式,这就意味着某一时刻只能由客户端向服务器请求或者服务器向客户端发送数据,而不能同时进行

Ø 验证请求用户的账户和密码是否正确,如果账户和密码错误,会报错"Access denied for user";

Ø 若是用户名和密码校验通过,然后就会到权限表获取当前用户拥有的权限,会检查该语句是否有权限,若是没有权限就直接返回错误信息,有权限会进行下一步。

2. 缓存

Ø MySQL的缓存主要的作用是为了提升查询的效率,缓存以key和value的哈希表形式存储,key是具体的sql语句,value是结果的集合。如果无法命中缓存,就继续走到分析器的的一步,如果命中缓存就直接返回给客户端 。完成后会将结果缓存起来以便再次查询获取,当下一次进行查询的时候也是如此的循环操作。

注意MySQL的8.0版本以后,缓存被官方删除掉了。之所以删除掉,是因为查询缓存的失效非常频繁,如果在一个写多读少的环境中,缓存会频繁的新增和失效。对于某些更新压力大的数据库来说,查询缓存的命中率会非常低目前在5.6的版本中已经默认关闭

3. 分析器

Ø 分析器的主要作用是将客户端发过来的sql语句进行分析,解析sql语句的语义,并进行关键词和非关键词进行提取、解析,如果分析到语法错误,会直接给客户端抛出异常:ERROR:You have an error in your SQL syntax.

Ø 这个阶段也会做一些校验:比如校验当前数据库中该表是否存表中字段不存在同样会报错:unknown column in field list.

4. 优化器

Ø 主要是进行sql语句的优化,会根据执行计划进行最优的选择,匹配合适的索引,选择最佳的执行方案。

5. 执行器

Ø 在执行器的阶段,此时会调用存储引擎的API,API会调用存储引擎,引擎负责对具体的数据文件进行操作,对sql的语义比如select或者update进行分析,执行具体的操作。在执行完以后会将具体的操作记录到binlog中,需要注意的一点是:select不会记录到binlog中,只有update/delete/insert才会记录到binlog中。而update会采用两阶段提交的方式,记录都redolog中

二、执行的状态

Ø 可以通过命令:show full processlist,展示所有的处理进程,主要包含了以下的状态其中具体的含义如下图:

 

三、sql的执行顺序

Ø 事实上,sql并不是按照我们的书写顺序来从前往后、左往右依次执行的,它是按照固定的顺序解析的,主要的作用就是从上一个阶段的执行返回结果来提供给下一阶段使用,sql在执行的过程中会有不同的临时中间表,一般是按照如下顺序:

例子: select distinct s.id from T t join S s on t.id=s.id where t.name=“Yrion” group by t.mobile having count(*)>2 order by s.create_time limit 5;

from第一步就是选择出from关键词后面跟的表,这也是sql执行的第一步:表示要从数据库中执行哪张表。

实例说明:在这个例子中就是首先从数据库中找到表T

join onjoin是表示要关联的表,on是连接的条件。通过from和join on选择出需要执行的数据库表T和S,产生笛卡尔积,生成T和S合并的临时中间表Temp1。on:确定表的绑定关系,通过on产生临时中间表Temp2.

实例说明:找到表S,生成临时中间表Temp1,然后找到表T的id和S的id相同的部分组成成表Temp2,Temp2里面包含着T和Sid相等的所有数据

where:where表示筛选,根据where后面的条件进行过滤,按照指定的字段的值(如果有and连接符会进行联合筛选)从临时中间表Temp2中筛选需要的数据,注意如果在此阶段找不到数据,会直接返回客户端,不会往下进行.这个过程会生成一个临时中间表Temp3。注意在where中不可以使用聚合函数,聚合函数主要是(min\max\count\sum等函数)

实例说明:在temp2临时表集合中找到T表的name="Yrion"的数据,找到数据后会成临时中间表Temp3,temp3里包含name列为"Yrion"的所有表数据

group by:group by是进行分组,对where条件过滤后的临时表Temp3按照固定的字段进行分组,产生临时中间表Temp4,这个过程只是数据的顺序发生改变,而数据总量不会变化,表中的数据以组的形式存在

实例说明:在temp3表数据中对mobile进行分组,查找出mobile一样的数据,然后放到一起,产生temp4临时表。

Having:对临时中间表Temp4进行聚合,这里可以为count等计数,然后产生中间表Temp5,在此阶段可以使用select中的别名

实例说明:在temp4临时表中找出条数大于2的数据,如果小于2直接被舍弃掉,然后生成临时中间表temp5

select:对分组聚合完的表挑选出需要查询的数据,如果为*会解析为所有数据,此时会产生中间表Temp6

实例说明:在此阶段就是对temp5临时聚合表中S表中的id进行筛选产生Temp6,此时temp6就只包含有s表的id列数据,并且name=“Yrion”,通过mobile分组数量大于2的数据

Distinct:distinct对所有的数据进行去重,此时如果有min、max函数会执行字段函数计算,然后产生临时表Temp7

实例说明:此阶段对temp5中的数据进行去重,引擎API会调用去重函数进行数据的过滤,最终只保留id第一次出现的那条数据,然后产生临时中间表temp7

order by:会根据Temp7进行顺序排列或者逆序排列,然后插入临时中间表Temp8,这个过程比较耗费资源

实例说明:这段会将所有temp7临时表中的数据按照创建时间(create_time)进行排序,这个过程也不会有列或者行损失

limit:limit对中间表Temp8进行分页,产生临时中间表Temp9,返回给客户端。

实例说明:在temp7中排好序的数据,然后取前五条插入到Temp9这个临时表中,最终返回给客户端

注意:实际上这个过程也并不是绝对这样的,中间MySQL会有部分的优化以达到最佳的优化效果,比如在select筛选出找到的数据集


以上是关于Mysql执行过程及顺序的主要内容,如果未能解决你的问题,请参考以下文章

Mysql执行过程及顺序

MySQL执行过程以及顺序

MySQL语法--05--SELECT的执行过程

mysql 存储过程的实现原理

MySQL存储过程 DELIMITER的作用及用法

mysql联合索引的使用以及sql执行的过程顺序