龙空技术网

一条SQL如何在MYSQL中执行的

inotebook 86

前言:

现在姐妹们对“mysql内置方法”大体比较注意,咱们都需要分析一些“mysql内置方法”的相关知识。那么小编也在网摘上收集了一些对于“mysql内置方法””的相关文章,希望小伙伴们能喜欢,各位老铁们快快来学习一下吧!

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

Server层:主要包括连接器、查询缓存、分析器、优化器、执行器等;所有跨引擎的功能都包含在这里面,如存储过程、触发器、视图、函数及通用日志模板binglog日志模块。

存储引擎层:负责数据的存储及读取,采用拔插式架构。目前默认InnoDB引擎。

server层主要包括

连接器:身份认证(登录mysql用);

查询缓存:执行查询语句的时候,会先执行查询缓存(在新的8.0版本已经被移除);

分析器:没有命中缓存的话,SQL语句会经过分析器,分析器会先检查sql词法分析提取关键字,然后再语法分析是否正确;

优化器:mysql认为最优方案执行;

执行器:执行sql,并从存储引擎返回数据。

查询语句分析

select * from person where age = 18 and name ='flink';

先检查该语句是否有权限,如果没有权限,直接返回错误。若有权限8.0版本前会先查询缓存;

第二步通过分析器进行词法分析,获取sql语句关键字,如上语句的select,提取需要查询的表person,需要查询所有列,查询条件age=18 , 然后判断这个语句是否有语法错误;

接下来是优化器进行确定执行方案,优化器会根据自己的优化算法选择一个最优方案执行。如果是先查出age=18,然后判断name='flink';还是先查询name='flink',还是再查询age=18;

最后进行权限校验,并返回引擎的执行结果。

更新语句分析

update person set age=20 where name='flink';

先查询到这条数据;

然后拿到查询语句,把age改成20,然后调用引擎API,写入这一行数据,InnoDB引擎把数据保存在内存中,同时记录redo log 且 这时redo log马上进入prepare状态,然后告诉执行器,执行完成可以提交。

执行器收到通知后记录binlog,然后调用引擎接口,提交redo log为提交状态。

完成更新。

为什么有2个日志模块

由于最初mysql并没有InnoDB引擎,后来收购后以插件方式加入mysql中,redo log是InnoDB独有的能保证数据库异常后之前提交的记录不丢失,mysql自带的binlog日志只用来归档。

redo log与binlog这2个日志模块如何分工协作

mysql在处理过程中保证数据完整性:

先判断redo log中数据是否完整,如果判断完整,就立即提交。

如果redo log只是预提交但是不是commit状态,这个时候就去判断binlog是否完整,如果也是完整的就会提交redo log,如果不完整就会执行回滚事务。

如上可以解决数据一致性问题。

标签: #mysql内置方法