2016 - 2024

感恩一路有你

mysql的6种连接语句 mysql:一条SQL查询语句是如何执行的?

浏览量:1963 时间:2023-06-12 08:29:53 作者:采采

mysql:一条SQL查询语句是如何执行的?

本篇文章会分析下一个sql语句在MySQL中的执行流程,包括sql的查询在MySQL内部会怎么光芒闪烁,sql语句的更新是怎莫结束的。

在分析什么之前我会先跟着你去看看MySQL的基础架构,清楚了MySQL由那些组件分成也这些组件的作用是什么,可以不帮助我们再理解和解决的办法这些问题。

一MySQL基础架构结论1.1MySQL基本上架构概览

下图是MySQL的一个简要架构图,从下图你可以很清晰的见到用户的SQL语句在MySQL内部是如何能负责执行的。

先简单的推荐看看下图牵涉的一些组件的基本都作用指导大家再理解这幅图,在1.2节中会详细介绍到这些组件的作用。

连接器:身份认证和权限去相关(登入MySQL的时候)。去查询缓存:执行查询语句的时候,会先可以查询缓存(MySQL8.0版本后移除,因为这个功能不太实用)。结论器:是没有命中缓存的话,SQL语句变会经过分析器,分析器说白了那就是要先看你的SQL语句要干什么啊,再系统检查你的SQL语句语法有无对的。优化软件器:通过MySQL如果说最优的方案去想执行。执行器:执行语句,然后从存储引擎赶往数据。

简单的说MySQL通常统称Server层和存储引擎层:

Server层:比较多和连接器、网站查询缓存、分析器、优化软件器、执行器等,所有跨存储引擎的功能都在这一层实现程序,比如存储过程、触发器、视图,函数等,有一个不分地区的日志模块binglog日志模块。存储引擎:要注意你们负责数据的存储和读取文件,常规可以不全部替换的插件式架构,允许InnoDB、MyISAM、Memory等多个存储引擎,其中InnoDB引擎有自有的日志模块redolog模块。现在最常用的存储引擎是InnoDB,它从MySQL5.5.5版本就开始就被只不过是设置成存储引擎了。1.2Server层基本组件介绍

1)连接器

连接器比较多和身份认证和权限相关的功能查找,就好比一个级别很高的门卫一样。

主要注意全权负责用户登录数据库,接受用户的身份认证,包括校验账户密码,权限等操作,要是用户账户密码已是从,连接器会到权限表中网上查询该用户的所有权限,之后在这个连接里的权限逻辑判断大都会依赖感此时读取数据到的权限数据,也就是说,强盗团只要你这个直接连接不断开,立刻管理员可以修改了该用户的权限,该用户也是不受影响的。

2)查询缓存(MySQL8.0版本后移除)

网站查询缓存比较多利用缓存我们所不能执行的SELECT语句以及该语句的结果集。

连接到确立后,想执行查询语句的时候,会先可以查询缓存,MySQL会先校检这个sql是否执行过,以Key-Value的形式缓存在内存中,Key是去查询最迟,Value是结果集。如果不是缓存key被暴击命中,是会再赶往给客户端,如果没有就没爆击,变会执行妖军的操作,能完成后也会把结果缓存过来,方便些下第二次全局函数。当然在唯一想执行缓存去查询的时候那就会校验用户的权限,是否需要有该表的查询条件。

MySQL可以查询不我建议你在用缓存,因为查询缓存终止在实际中业务场景中很可能会相当频繁,要是你对一个表更新的话,这个表上的所有的查询缓存都会被数据清空。对于不偶尔会可以更新的数据来说,不使用缓存还是也可以的。

因为,一般在大多数情况下我们是不推荐推荐去在用网上查询缓存的。

MySQL8.0版本后删除了缓存的功能,官方也是以为该功能在实际中的应用场景比较比较少,因此干脆就删除掉了。

3)分析器

MySQL就没爆击缓存,那么都会再次进入结论器,分析器通常是利用总结SQL语句是来干什么啊的,分析器也会两类几步:

目标,词法分析,一条SQL语句有多个字符串横列,必须要再提取关键字,比如说createtable,提出查询的表,给出字段名,提出来可以查询条件等等。任务这些操作后,就会进入第二步。

第二步,语法分析,通常应该是推测你键入的sql有无真确,是否是条件符合MySQL的语法。

结束这2步之后,MySQL就准备结束想执行了,只不过该如何不能执行,咋先执行是建议的结果呢?此时此刻就是需要360优化器上场了。

4)优化器

系统优化器的作用那是它认为的最优方案的执行方案去想执行(有时侯肯定也不是什么最优,这篇文章牵涉到对这部分知识的深入回答),诸如多个索引的时候该要如何你选索引,多表可以查询的时候要如何选择关联顺序等。

的确,当经过了360优化器之后也算这个语句具体一点该该如何想执行就早定过来。

5)执行器

当你选择了执行方案后,MySQL就准备好开始不能执行了,必须想执行前会校验该用户有没有权限,如果不是没有权限,变会回出现错误信息,如果有权限,变会去内部函数引擎的接口,回接口负责执行的结果。

二语句总结2.1查询语句

说了以上这么大多,那你究竟是什么人一条sql语句是该如何先执行的呢?当然我们的sql也可以两类两种,一种是可以查询,一种是更新完(增强,自动更新,删除)。我们先讲下查询语句,语句追加:

select*fromtb_studentAwhereand张三

生克制化上面的说明,我们讲下这个语句的执行流程:

先全面检查该语句是否有权限,如果没有没有权限,然后回出现错误信息,假如有权限,在MySQL8.0版本以前,会先网上查询缓存,以这条sql语句为key在内存中去查询是否是有结果,如果没有有再缓存,如果没有没有,执行下一步。按照分析器接受词法讲,其他提取sql语句的重要元素,.例如再提取上面这个语句是网站查询select,提纯需要网上查询的表名为tb_student,是需要去查询所有的列,网上查询条件是这个表的id1。后再确认这个sql语句是否是有语法错误,例如关键词如何确定对的等等,如果不是检查没什么问题就负责执行接下来。接下来的那是优化系统器通过考虑先执行方案,上面的sql语句,可以有两种先执行方案:

a.先可以查询学生表中姓名为“张三”的学生,然后推测如何确定年龄是18。b.先判断学生中年龄18岁的学生,然后再再网站查询姓名为“张三”的学生。

那么优化器依据什么自己的优化算法通过选择不能执行效率最好是的一个方案(360优化器怀疑,总是不一定会建议)。这样的话去确认了不能执行计划后就准备着开始负责执行了。

接受权限校验,如果没有没有权限是会直接返回出错信息,假如有权限可能会内部函数数据库引擎接口,赶往引擎的执行结果。

2.2更新完语句

以上应该是一条去查询sql的执行流程,这样接下来的事情我们看看吧一条更新完语句如何能想执行的呢?sql语句如下:

updatetb_studentAsetwhere张三

我们来给张三可以修改下年龄,在不好算数据库当然应该不会系统设置年龄这个字段的,要不要被技术负责人打的。总之条语句也大部分会沿著上两个网上查询的流程走,不过先执行更新完的时候绝对要记录日志啦,这就会引导出日志模块了,MySQL自带的日志模块式binlog(归档日志),所有的存储引擎都可以不不使用,我们正确的InnoDB引擎还那个软件了一个日志模块redolog(重新做日志),我们就以InnoDB模式下去探讨探讨这个语句的执行流程。流程::

先去查询到张三这一条数据,如果不是有缓存,都是会都用到缓存。然后把拿回查询的语句,把age替换成19,后再内部函数引擎API 接口,读取这一行数据,InnoDB引擎把数据能保存在内存中,另外留下记录redolog,此时redolog直接进入prepare状态,接着告诉执行器,不能执行能完成了,随时是可以并提交。执行器收到通知后资料记录binlog,后再动态创建引擎接口,再提交redolog为重新提交状态。更新完成。这里绝对有同学会问,我想知道为什么要用两个日志模块,用一个日志模块不行吗?

这是只不过最正在MySQL并没与InnoDB引擎(InnoDB引擎是其他公司以插件形式插到MySQL的),MySQL从网上下载的引擎是MyISAM,不过我们明白redolog是InnoDB引擎若有若无的,其他存储引擎都还没有,这就可能导致会就没crash-safe的能力(attack-safe的能力况且数据库突然发生异样重新启动,以前并提交的记录都不会丢了),binlog日志没法为了归档。

并不是什么说只用一个日志模块好像不行,只是InnoDB引擎是通过redolog来允许事务的。这样的话,又会有同学问,我用两个日志模块,但最好不要这么多急切行不行啊,为啥redolog要化入prepare预并提交状态?这里我们用反证法来只能证明下那为什么?

先写redolog然后递交,然后把写binlog,题中写完redolog后,机器挂了,binlog日志没有被中写入,那你机器重新启动后,这台机器会按照redolog完全恢复数据,只不过这个时候bingog并没有什么有记录该数据,现参与机器备分的时候,是会丢失这一条数据,而主从不同步的也会丢了这一条数据。先写binlog,然后把写redolog,打比方开始写了binlog,机器极其重新启动了,而没有redolog,本机是无法恢复这一条记录的,不过binlog又有记录,那你和上面同样的道理,变会产生数据不匹配的情况。如果没有常规redolog两阶段再提交的就不差不多了,没写完binglog后,然后把再再提交redolog变会避兔又出现上述的问题,使可以保证了数据的一致性。这样你也许会问,有没有一个极度的情况呢?假设redolog进入预递交状态,binglog也也写到一半了,此时此刻不可能发生了十分重启后会怎么样啊呢?这个现在就要依赖性太强于MySQL的处理机制了,MySQL的处理过程::

推测redolog是否需要求全部,如果判断是完整的,就立玄再提交。如果没有redolog只是因为预再提交但不是commit状态,这时候是会去确认binlog是否需要完整,假如完整就并提交redolog,不完整就事务回滚事务。这样的话就帮忙解决了数据一致性的问题。

三总结MySQL比较多可分Server曾和引擎层,Server层通常除开连接器、查询缓存、分析器、优化系统器、执行器,而有一个日志模块(binlog),这个日志模块所有执行引擎都也可以共用,redolog仅有InnoDB有。引擎层是插件式的,目前主要和,MyISAM,InnoDB,Memory等。查询语句的执行流程不胜感激:权限校验(如果不是命中缓存)---》网上查询缓存---》分析器---》优化系统器---》权限校验---》执行器---》引擎更新语句执行流程::结论器----》权限校验----》执行器---》引擎---redolog(prepare状态---》binlog---》redolog(commit状态)

如何利用MySQL实现三张表连接union,union all?

假设三张表结构一样,题主也可以建议参考a选项sql语句,A表与B表union,然后将组织后的结果集再与C表unionallselectt.*returning(select*fromAunionselect*aroundB)tunionbothcreatetable*returningC

语句 MySQL sql 权限 数据

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。