一条更新语句完整流程图如下所示:
步骤:
一:客户端层
①:mysql的客户端执行sql
update t set name = ‘zhuge666’ where id = 1;
id为1的name原来的值是zhuge。
二:mysql服务器层
②: 进入mysql服务器,由连接器验证账号密码等身份信息,验证通过去查mysql缓存,如果有,直接返回。没有进入分析器。
③:进入mysql的分析器,分析sql语句是否符合mysql规范。
④:进入sql优化器,mysql底层优化sql,比如调换索引列等。
⑤:进入执行器,执行sql。
三:innoDB引擎层
mysql服务层后边连接了很多引擎层,如MyIsam、innoDB等,这里只分析innoDB引擎。
⑥:加载磁盘上id为1的整页数据到 buff pool缓存池中,此时buff pool中的name值为zhuge,为什么加载整页,因为磁盘上存储数据都是整页整页存的。
⑦:把buff pool中的 旧值 zhuge 写入undo日志版本链,方便事务提交失败后回滚,回滚时直接中undo日志版本链中取值即可。
⑧:在buff pool中把新的值 zhuge666 赋给 name,此时只有buff pool中的name属性做了更新,磁盘上的文件还是原来的旧值 zhuge。
⑨:执行器把更新的操作写入内存中Redo Log buffer(Redo日志缓冲区),此时 磁盘上的文件还是原来的旧值 zhuge。