本篇会涉及到MVVC、锁、redo log、binlog等知识点,帮助理解一条SQL语句是如何执行的!
1.查询语句
1.1查询流程
1.通过TCP建立连接,验证密码和权限。
2.查询缓存,若SQL语句(这里是字符串)命中直接返回结果,这里也涉及到了权限验证,验证用户是否有该表的权限。(MySQL8的时候移除了缓存,因为缓存的更新的较快,表更新了就会清除缓存,值适合与表信息不变的情况)
3.分析器:进行词法分析,分析出语句和参数,语法分析,分析语句是否满足MySQL语法。
4.优化器:对SQL语句进行优化,涉及到jion语句的顺序和联合索引等。
5.执行器:进行查询并返回结果集。
1.2小提示-查询分为当前查和快照查
1.2.1当前查
?当前查是查询最新的值,一般是通过加读锁或者写锁来实现。
1.2.2快照查
快照查则会可以查询到历史版本的数据,是基于MVCC和undo log来实现的。
2.更新语句
2.1更新流程
1.通过TCP建立连接,验证密码和权限。
2.查询需要更新的数据是否在内存中,不在的话需要通过IO从磁盘中加载进来。
3.对数据进行修改,写入内存。
4.redo log进行prepare。
5.写入binlog。
6.事务提交commit状态。
2.2两阶段提交
目的:是为了保证redo log和binlog不冲突。
先prepare进行准备写redo log,在进行写binlog,然后在是commit状态的redo log,只要binlog记录完整,则可以代表事务完成,否则需要进行回滚。
2.3为啥需要binlog和redo log并存
?binlog是用来归档的,记录的是转增个server变更的动作,按照追加的方式进行写文件,无法知道哪些已经flush到磁盘中了。
redo log是用来crash safe的,记录了修改的部分,采用循环读写的,无法用来做归档,flush到磁盘中的记录需要清除的。
?2.4为啥需要redo log,直接flush到磁盘不香吗
涉及到随机IO和顺序IO的问题。
redo log是记录修改地方二等日志,将redo log写入磁盘是顺序IO的,非常快。直接将修改的数据flush到磁盘是随机IO的,速率非常慢。?
|