前言:
现在姐妹们对“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内置方法