以一次更新为例讲述使用innodb引擎时mysql发生了什么

一.先上图

在这里插入图片描述

二.各组件讲解

1.首先线程接收到sql之后会根据不同的类型调用不同的SQL接口
2.sql解析器会去解析sql,将sql语句拆解成一步步的mysql需要做什么,比如更新user表中的id为10的记录的name字段为张三,那么大致可以分成以下几步:

找到user表
找到id为10的记录
更新name字段

3.查询优化器会去从众多的查询路径中去选择一个合适的查询路径,比如我们这里需要从user表中获取id为10的字段去更新其name,name我们到底是去user表中获取所有的记录然后一条条筛选知道筛选出来id=10的那一条,还是走索引去获取这条数据呢,这就是查询优化器干的事情
4.执行器的作用就是顺着我们设置好的查询路径去一步步的执行操作,调用存储引擎去完成我们要做的事情

三.当执行器调用存储引擎时发生了什么

首先我们需要去更新一条数据,那么innodb引擎会将数据加载到buffer pool中,这个buffer pool由描述数据和缓存页组成,一个缓存页对应磁盘上的一个数据页,这里不深入讲.mysql通过buffer pool的机制让所有操作都在缓存中进行,大大提升了性能
在更新前我们innodb引擎回去写undo log也就是重做日志,这个日志的作用主要是去支持日志回滚。
随后执行器就会去更新缓存页中的数据,并将操作写入到redolog buffer中,即重做日志。重做日志中的内容类似于对XX缓存页中的XX数据行的XX字段进行了修改,主要是为了防止mysql突然宕机那么重启时数据可以恢复
然后事务准备提交了执行器会去写binlog日志也叫归档日志,这个日志存储内容与redolog类似,不同的是归档日志存储的内容偏向于逻辑,类似于对user表中id为10的记录的name字段修改为了XXX.此外redolog是innodb引擎独有的而binlog是mysql的
再然后会去将redolog buffer中的数据刷入到磁盘中,然后将binlog日志的名称以及位置连同commit标记一起写入到redolog中,至此一次事务的提交就完成了
另外:关于缓存页中的数据何时刷入磁盘,mysql后台有一个IO线程会定期将脏页(被修改了数据的缓存页)刷入磁盘中

本文引用了儒猿技术窝内容,感兴趣可以通过微信二维码了解
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值