mysql where条件执行顺序_一步步剖析SQL执行顺序

本文详细阐述了MySQL查询语句的执行过程,包括FROM、ON、OUTER JOIN、WHERE、GROUP BY、HAVING等步骤,并介绍了执行优化器和执行器的角色。通过示例解释了SQL如何被MySQL内部处理,帮助理解查询的执行流程。
摘要由CSDN通过智能技术生成
SQL 不同于与其他编程语言的最明显特征是处理代码的顺序。在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后被处理。

230edd1e32a33b10a53ddcda9706b6bb.png

01

         执行顺序详解        

1. FROM:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt1

2. ON: 对vt1表应用ON筛选器只有满足 join_condition 为真的行才被插入vt2

3. OUTER(JOIN):如果指定了 OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2,生成t3,如果 from 包含两个以上表,则对上一个联结生成的结果表和下一个表重复执行步骤。

4. WHERE:对vt3应用 WHERE 筛选器只有使 where_condition 为true的行才被插入vt4

5. GROUP BY:按GROUP BY子句中的列列表对vt4中的行分组生成vt5

6. CUBE|ROLLUP:把超组(supergroups)插入vt6,生成vt6

7. HAVING:对vt6应用HAVING筛选器只有使 having_condition 为true的组才插入vt7

8. SELECT:处理select列表产生vt8

9. DISTINCT:将重复的行从vt8中去除产生vt9

10. ORDER BY:将vt9的行按order by子句中的列列表排序生成一个游标vc10

02

   MySQL执行sql的流程   

86f6a79e8db8d4b8ad54fb241c5ee6c3.png

03 

            示列            

SELECT dept,COUNT(phone) AS num FROM User WHERE age< 25 GROUP BY dept HAVING num >= 3 ORDER BY num DESC,dept ASC LIMIT 0,2;

1、执行连接器

开始执行这条sql时,会检查该语句是否有权限,若是没有权限就直接返回错误信息,有权限会进行下一步,校验权限的这一步是在图一的连接器进行的,对连接用户权限的校验。 2、执行检索内存 相连建立之后,履行查询语句的时候,会先行检索内存,Mysql会先行冗余这个sql与否履行过,以此 Key-Value 的形式平缓适用内存中,Key是 检索预定 ,Value是 结果集 。 假如内存key遭击中,便会间接回到给客户端,假如没命中,便会履行后续的操作,完工之后亦会将结果内存上去,当下一次进行查询的时候也是如此的循环操作。 3、执行分析器 分析器主要有两步:(1) 词法分析 (2) 语法分析 词法分析主要执行 提炼关键性字 ,比如select, 提交检索的表提交字段名提交检索条件 。语法分析主要执行辨别你 输出的sql与否准确 ,是否 合乎mysql的语法 。 当Mysql没有命中内存的时候,接着执行的是 FROM student 负责把数据库的表文件加载到内存中去, WHERE age< 60 ,会把所示表中的数据进行过滤,取出符合条件的记录行,生成一张临时表,如下图所示。
c5e1cc583d7146c9d6c6b4cc2d0f559b.png

GROUP BY dept 会把上图的临时表分成若干临时表,切分的过程如下图所示:

ed470b8c3f9f3291ee596732fe0c28ae.png

a4206403f1d03376f8acb3c3a1718d0f.png

查询的结果只有部门2和部门3才有符合条件的值,生成如上两图的临时表。接着执行 SELECT后面的字段 ,SELECT后面可以是 表字段 也可以是 聚合函数 。 这里SELECT的情况与是否存在 GROUP BY 有关,若是不存在Mysql直接按照上图内存中整列读取。若是存在分别SELECT临时表的数据。 最后生成的临时表如下图所示:

42e569d0f34cbf8f827bd12b6cd09a55.png

紧接着执行 HAVING num>2 过滤员工数小于等于2的部门,对于 WHEREHAVING 都是进行过滤,那么这两者有什么不同呢? 第一点是WHERE后面只能对表字段进行过滤,不能使用聚合函数,而HAVING可以过滤表字段也可以使用聚合函数进行过滤。 第二点是WHERE是对执行from USer操作后,加载表数据到内存后,WHERE是对 原生表的字段 进行过滤,而HAVING是对 SELECT后的字段进行过滤 ,也就是WHERE 不能使用别名进行过滤 。 因为执行WHERE的时候,还没有SELECT,还没有给字段赋予别名。接着生成的临时表如下图所示:

b3b8971f673cab23c89e39c94f088458.png

最后在执行 ORDER BY 后面的排序 以及 limit0,2 取得前两个数据,因为这里数据比较少,没有体现出来。最后生成得结果也是如上图所示。接着判断这个sql语句 是否有语法错误关键性词与否准确 等等。

4、执行优化器

查询优化器会将解析树转化成执行计划。一条查询可以有多种执行方法,最后都是返回相同结果。优化器的作用就是找到这其中 最好的执行计划 。 生成执行计划的过程会消耗较多的时间,特别是存在许多可选的执行计划时。如果在一条SQL语句执行的过程中将该语句对应的最终执行计划进行缓存。 当 相似的语句 再次被输入服务器时,就可以直接 使用已缓存的执行计划 ,从而跳过SQL语句生成执行计划的整个过程,进而可以提高语句的执行速度。
03d19dfb733201b21c7de576d7fc213e.png
M ySQL使用基于成本的查询优化器。它会尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最少的一个。

5、执行执行器

由优化器生成得执行计划,交由执行器进行执行,执行器调用存储引擎得接口,存储引擎获取数据并返回,结束整个查询得过程。 这里之讲解了select的过程,对于update这些修改数据或者删除数据的操作,会涉及到事务,会使用两个日志模块,redo log和binlog日志。具体对这两个日志的介绍请看着一篇文章。 以前的Mysql的默认存储引擎MyISAM引擎是没redo log的,而现在的默认存储引擎InnoDB引擎便是透过redo 复杂度来拥护事务的,保证事务能够准确的回滚或者提交,保证事务的ACID。

1ed130648d1ec4615dd01b537c24f668.png

c912023ded52f4ac196c4a375316e62b.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值