日记大全

日记大全 > 句子大全

探索MySQL数据库中SQL语句的执行流程

句子大全 2023-07-31 03:33:01
相关推荐

最近起于研习mysql相关知识,自己依据学到的知识点,依据自己的理解编纂共享出,本篇文章会研究之下一个sql语句于mysql之中的执行流程,包含sql的查询于mysql外部会怎么无常,sql语句的更新是怎么完工的。

一、mysql架构分析

上面是mysql的一个简要架构图:

mysql主要分为Server层与存储引擎层

Server层:重要包含连接器、检索内存、分析器、优化器、执行器等,所有跨存储引擎的功能均于这一层构建,例如存储过程、触发器、视图,函数等,有一个标准化的日志模块 binglog日志模块。

存储引擎: 重要专责数据的存储与存取,使用可更换的插件式架构,拥护InnoDB、MyISAM、Memory等多个存储引擎,其中InnoDB引擎有自有的日志模块redolog 模块。

InnoDB 5.5.5版本当作管理器引擎。

连接器

重要专责用户登录数据库,展开用户的身份认证,包含校验账户密码,权限等手动,假如用户账户密码已经透过,连接器会到权限表中检索该用户的所有权限,后于这个相连里面的权限逻辑判断均是会局限此时存取到的权限数据,也就是说,先前如果这个连接不断开,实时管理员修正了该用户的权限,该用户亦是绝不受影响的。

检索内存

相连建立之后,履行查询语句的时候,会先行检索内存,Mysql会先行冗余这个sql与否履行过,以此Key-Value的形式平缓适用内存中,Key是检索预定,Value是结论集。假如内存key遭击中,便会间接回到给客户端,假如没命中,便会履行后续的操作,完工之后亦会将结果内存上去,便于之下一次初始化。或许于其实履行内存检索的时候仍然会冗余用户的权限,与否有该表的查询条件。

Mysql 检索绝不提议采用内存,由于对常常改版的数据来说,内存的精确时间甚长了,常常造成的效果并且绝不糟糕,对绝不常常改版的数据来说,采用内存仍然可的,Mysql 8.0 版本之后移除了内存的功能,官方亦是相信该功能于具体的应用场景较难,因此索性间接删掉了。

分析器

mysql 没击中内存,那麽便会转入分析器,分析器重要是用来研究SQL语句是来干嘛的,分析器亦会分成几步:

第一步,词法分析,一条SQL语句有多个字符串构成,最先要提炼关键性字,比如select,提交检索的表,提交字段名,提交检索条件等等。做完这些手动之后,便会转入第二步。

第二步,语法分析,重要便是辨别你输出的sql与否准确,与否合乎mysql的语法。

完工这2步后,mysql便预备起履行了,不过如何履行,怎么履行是最为糟糕的结果呢?这个时候便需优化器上阵了。

改进器

优化器的作用便是它相信的最为优的执行方案去履行(尽管有时亦绝不是最为优),例如多个数据库的时候该如何选取数据库,余表检索的时候如何选取关联顺序等。

执行器

当选取了执行方案之后,mysql便预备起履行了,最先履行前会冗余该用户有没有有权限,假如没权限,便会回到错误信息,假如有权限,便会去初始化引擎的接口,回到接口履行的结果。

二、句子研究

2.1 检索语诗

说了超过这么余,那麽到底一条sql语句是如何履行的呢?实际上我们的sql可分为2之中,一种是检索,一种是改版(减少,改版,移除)。我们先行研究之下检索语句,句子下述:

1

select * from tb_student A where A.age="18" and A.name="张三";

融合下面的说明,我们研究下这个语句的执行流程:

先检验该语句与否有权限,假如没权限,间接回到错误信息,假如有权限,于mysql8.0版本之前,会先检索内存,以此这条sql语句作为key在内存中检索与否有结果,假如有间接缓存,假如没,履行之下一步。

透过分析器展开词法分析,提炼sql语句的关键元素,例如提炼下面这个语句是检索select,提炼需检索的表名作为tb_student,需检索所有的列,检索条件是这个表的id="1"。接着辨别这个sql语句与否有语法错误,例如关键性词与否准确等等,假如检验没问题便履行之下一步。

接下去便是优化器展开确认执行方案,下面的sql语句,可有两种执行方案:

a.先检索学生表中姓名为“张三”的学生,接着辨别与否年龄是18。

b.先找出学生之中年龄18岁的学生,接着再次检索姓名为“张三”的学生。

那么优化器依据自己的优化算法展开选择执行效率最为糟糕的一个方案(优化器相信,有时绝不某种最为糟糕)。那麽证实了执行计划之后便预备起履行了。

展开权限校验,假如没权限便会回到错误信息,假如有权限便会初始化数据库引擎接口,回到引擎的执行结果。

2.2 改版语诗

超过便是一条检索sql的执行流程,那麽接下去我们看一条改版语句如何履行的呢?sql语句下述:

1

update tb_student A set A.age="19" where A.name="张三";

我们来予张三修正之下年龄,于具体数据库赞赏绝不会设立年龄这个字段的,否则要遭技术负责人打的。实际上条语句亦实际上会沿著之上一个检索的流程走,只是履行改版的时候赞赏要纪录日志啦,这便会引进日志模块了,mysql 自带的日志模块式binlog(文档日志),所有的存储引擎均可采用,我们常见的InnoDB引擎也自从带了一个日志模块redo log,我们便以InnoDB模式下去探究这个语句的执行流程。流程下述:

先检索到张三这一条数据,假如有缓存,亦是会用到内存。

然之后拿到检索的语句,将 age 改为19,接着初始化引擎API接口,写入这一行数据,InnoDB引擎将数据留存在内存中,除此之外记录redo log,此时redo log转入prepare状态,接着告知执行器,履行完工了,实时可递交。

执行器接到通知之后纪录binlog,接着初始化引擎接口,递交redo log 作为递交状态。

改版完工。

这里赞赏有同学会问,为什么要使用两个日志模块,使用一个日志模块怎么吗?这便是以前mysql的模式了,MyISAM引擎是没redo log的,那麽我们明白它是绝不拥护事务的,因此并且绝不是说仅用一个日志模块绝不可,只不过InnoDB引擎便是透过redo 复杂度来拥护事务的。那麽,亦会有同学问,我使用两个日志模块,不过你们这么简单行怎么,为什么redo log 要引进prepare预提交状态?这里我们使用反证法来解释之下为什么要这么做?

先行写redo log 间接递交,接着写 binlog,假定写完redo log 之后,机器挂了,binlog日志没遭加载,那麽机器重启之后,这台机器会透过redo log恢复数据,不过这个时候bingog并且没纪录该数据,先前展开机器备份的时候,便会遗失这一条数据,除此之外主从同步亦会遗失这一条数据。

先行写binlog,接着写redo log,假定写完了binlog,机器非常并重启了,因为没redo log,本机是难以回复这一条纪录的,不过binlog亦有记录,那麽与下面同样的道理,便会造成数据绝不相同的情况。

假如使用redo log 两阶段递交的方式便绝不那样了,写完binglog之后,接着再次递交redo 复杂度便会防止出现上述的问题,进而确保了数据的一致性。那么问题来了,有没有有一个激进的情况呢?假定redo log 处在预提交状态,binglog亦已写完了,这个时候爆发了非常重启会怎么样呢? 这个便要局限在mysql的处理机制了,mysql的处理过程下述:

辨别redo log 与否完备,假如辨别是完备的,便立刻递交。

假如redo log 只不过预提交但绝不是commit状态,这个时候便会去辨别binlog与否完备,假如完备便递交 redo log, 绝不完备便回滚事务。

这样便克服了数据一致性的问题。

三、阐述

Mysql 主要分为Server曾与引擎层,Server层重要包含连接器、检索内存、分析器、优化器、执行器,除此之外也有一个日志模块(binlog),这个日志模块所有执行引擎均可共计用。

引擎层是插件式的,目前重要包含,MyISAM,InnoDB,Memory等。

sql等执行过程分成两类,一类对检索等过程下述:权限校验---》检索内存---》分析器---》改进器---》权限校验---》履行器---》引擎

对改版等语句履行流程如下:分析器----》权限冗余----》履行器---》引擎---redo log prepare---》binlog---》redo log commit

四、参照

《一同建构Mysql知识网络》

超过所述是小编予大家讲解的一条sql语句于mysql之中是如何履行的详解整合,期望对于大家大幅帮助,假如大家有任何疑问请予我贴文,大编会立即恢复大家的。

阅读剩余内容
网友评论
相关内容
拓展阅读
最近更新