牛马日记-SQL的执行流程

219 阅读5分钟

Holle 大家好,我的第二篇文章要开始写了哦,第一篇文章呢,写的时候还是有点迷茫的,不知道写文章的中心和主题是什么,没有方向感,那这次写第二篇文章了,内容呢还是想从Mysql数据库入手,想要记录一下自己学习Mysql的知识路程,这次的变化就是我的目标更明确了,抓住中心,这次的主题就是Mysql数据库的sql执行流程,也就是sql在数据库里怎么运作的,运作的顺序和原理,讲一下各个组件的功能,当然了理解的不一定特别深,表达一下自己的想法,OK,让我们开始吧,Let's go!🤠

SQL的执行流程:

image.png

场景模拟:宇哥逛商场!😏

客户端:

首先我们从图片的第一步开始,客户端是什么,这就很广泛了,可以是navicat(数据库连接工具)、也可以是java项目服务,只是一个操作数据库的用户,在打开客户端后,最初需要和sql服务器建立连接,账号认证和校验权限。

场景角色:宇哥🤡,宇哥=客户。

连接器:

提供了多个客户端与服务端操作的线程,类似于java的线程池,用户来了就调用我们的线程池,结束了就回收,避免资源浪费。 mysql客户端和服务器端的连接使用的是TCP协议,在完成TCP握手之后,连接器开始进行身份认证。连接后不会再刷新权限,除非是断开连接后才能刷新哦。 连接建立成功后,如果长时间没有操作,连接器会自动断开连接。断开连接的时间是由wait_timeout控制的,默认值是8小时。

场景角色:商场,商场就那么多的商户,作为我们的管理器。

查询缓存(MySQL 8.0 版本后移除):

查询缓存主要是缓存我们的sql语句以及该语句的结果集,也就是我们的select语句如果查询过了,再去查询就直接走缓存了,但是命中非常的低,因为需要sql是完全一致的(MySQL将缓存存放在一个引用表中,通过一个哈希值引用),如果有空格不一样都是匹配不到的。

还有一点就是,有缓存就会有缓存失效的情况,如果是数据被DML操作过了,那还要浪费一部分性能去更新,所以再8.0后移除了这个,如果小伙伴想使用体验一下也是可以的:query_cache_type=1,这样就打开缓存,还有一种模式是DEMAND(按需分配),query_cache_type=2,这种模式我们可以用sql来控制走不走缓存,在sql上加上SQL_CACHE就走缓存(不加默认),sql上加入SQL_NO_CACHE就不走缓存,还是比较人性化的。

场景角色:导购台

宇哥🐢:你好,我感觉非常冷🥶,我能买个裤子吗?

导购台🕵:我们这正好有一条,直接给您吧,您下次出门记得穿裤子!

宇哥🐢:谢谢,真是开心的一天😄!

怎么样,直接走缓存!还点是我宇哥!

分析器:

分为两种语法解析和语义解析。

首先分析语法,判断输入的这个 SQL 语句是否满足 MySQL 语法,会根据语法生成解析树,如果不符合要求就提示错误信息,然后去分析语义解析,必须表字段、表、视图等是否在数据库中,如果不对返回错误信息,这也就是我们写Select语句为什么先提示你语法写错了的原因了哦!

场景角色:服务员

宇哥🐢:你好!我要买一个绿色的,头上戴的东西。

服务员👨‍💼:告诉宇哥,I Know,你需要的是绿帽子!

宇哥🐢:yes,I like it!

优化器:

这个sql我们选择全表索引还是索引检索啊,连表怎么用比较好啊,用来优化我们的sql执行性能的,在这一步会生成一个执行计划,

mysql用的优化规则是CBO—Cost_Based Potimizer(基于成本的优化器)CBO在会从目标诸多的执行路径中选择一个成本最小的执行路径来作为执行计划。这里的成本他实际代表了MySQL根据相关统计信息计算出来目标SQL对应的步骤的IO,CPU等消耗。也就是意味着数据库里的成本实际上就是对于执行目标SQL所需要IO,CPU等资源的一个估计值。而成本值是根据索引,表,行的统计信息计算出来的。(计算过程比较复杂),简单理解就是计算成本最小的规则。

场景角色:裁缝员

裁缝员👩‍⚖️‍:您好,需要帮助吗

宇哥🐢:I need a vary green hat!but my hat not green enough(不够绿)!

导购员👩‍⚖️‍:那肯定的啊,您这个气质必须改成这款青青草原帽🎩了。

优化器果然不同凡响,精确找到宇哥需要!

执行器:

执行器先去校验用户有没有权限,没有权限就直接返回错误信息,有权限就去存储引擎去执行优化器生成的执行计划了,执行器将上述便利过程的所有满足条件的行组成的记录集作为结果集返回给客户端,同时存储缓存里。

场景角色:收银员

宇哥🐢:买单!

收银员🙋:呦,倍绿啊您,你配买个帽子!付钱吧,我给你拿货!

场景就模拟完成了,出货了您!

最后:

我的第二篇文章写到这里就收尾了,因为我只想讲一下mysql的执行流程也是最近学习的内容,还有一个执行引擎还没有说到,现在我还理解的不太好,等后续的文章会说到。

那后续我会继续学习,主要的方向会在mysql的索引、日志、事务上写文章,目标呢就是学习我们平常工作中不太了解的原理内容,然后作为笔记的方式展现出来,下一篇还是继续,冲冲冲!

有那么一句话:我要让这痛苦压抑的世界绽放幸福快乐之花,向美好的世界献上祝福!!!(谁能说出这么不要脸的话呢?👀,不会是宇哥🐢吧)