MySQL_InnoDB执行流程

InnoDB执行流程

InnoDB执行流程
以更新语句为例

1.缓冲池(Buffer Pool)

缓冲池是InnoDB存储引擎非常重要的组件,它是在内存当中,当我们想要更新数据库一条数据的时候,它先看缓冲池中是否有该数据,如果没有从磁盘加载到缓冲池中,并且对这条数据加独占锁

2.undo日志文件

当我们更新这条数据之前,我们是要把这条数据写入undo日志文件中,因为事务执行失败需要对数据进行回滚,所以要把原来的值提前写入undo日志文件

3.redo log buffer

我们更新数据之后,会把这次更新操作写入redo log buffer中

4.redo日志文件

不管是更新数据还是把更新操作写入redo log buffer中,都是在内存中操作,MySQL服务器宕机就会造成数据丢失,所以事务提交时,我们要把,redo log buffer中的数据刷到redo日志文件中,MySQL服务器宕机我们也可以通过redo日志文件进行数据恢复

4.innodb_flush_log_at_trx_commit

我们可以通过innodb_flush_log_at_trx_commit来配置,确保事务提交之前,redo log buffer中的数据刷到磁盘上,当这个参数为0时,提交事务redo log buffer中数据不刷到磁盘,当这个参数为1时,提交事务必须把redo log buffer中的数据刷到磁盘,当这个参数为2时,提交事务把redo log bufer中的数据刷到os cache中,所以为了确保数据不丢失,一般情况下我们把这个参数设置为1

5.MySQL binlog

redo log是InnoDB存储引擎特有的,它是偏向物理性质的重做日志,它里面记录了类似"对哪个数据页的什么数据做了什么修改",binlog是MySQL server的日志文件,它是归档日志,比较偏向于逻辑性,它里面记录的东西类似于"对哪个表中的哪行数据做了更新操作,更新之后值是多少",当我们提交事务时,也会把这次记录写入binlog

6.sync_binlog

记录写入binlog也会有与之对应的策略,sync_binlog参数可以控制,当sync_binlog为0时,提交事务此时是写入os cache中,当sync_binlog为1时,提交事务此时是写入binlog磁盘文件中,通常我们会把sync_binlog设置为1

7.commit标记

当我们把binlog写入磁盘文件之后,还会把此次更新的binlog文件名以及此次更新在binlog文件中的位置写入到redo log文件中去,同时还会在redo log中写入一个commit标记,来保证redo log与binlog的一致,做完这些操作事务才算提交成功

8.Buffer Pool刷入磁盘

此时内存中的数据完成了修改,但是与之对应的磁盘文件上的数据还是原来的,MySQL会有一个后台IO线程,定时的把缓冲区中的数据随机刷到磁盘文件上

9.为什么不直接修改磁盘文件

直接更新磁盘上的数据是磁盘随机读写,磁盘随机读写的性能是最差的,这样会导致我们的MySQL服务器无法承载高并发场景,顺序写入磁盘文件的性能要远高于随机读写

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值