进阶篇07——InnoDB引擎介绍

概览

逻辑存储结构

架构

当执行增删改查操作时,操作的是缓冲区的数据,如果缓冲区里没有要操作的数据,就会从磁盘中读取数据加载到缓冲区中;缓冲区的数据会以一定的频率通过后台线程刷新到磁盘中永久存储。

内存结构 

 

磁盘结构

后台线程

后台线程的作用就是在合适的时机将内存缓冲池的数据刷新到磁盘文件当中

事务原理

基本概念

redo.log日志

解决事务的持久性

当客户端执行增删改操作时,就会去操作缓冲池中的数据(如果此时缓冲池没有所需要的数据,就会去磁盘文件中加载需要的数据到缓冲池里),然后对相应的数据页进行更改。缓冲池的某些数据页被更改后,和磁盘里存储的数据就不一致了,缓冲池里这些被修改的数据页就称为脏页。在一定的时机里,会通过后台线程将脏页的数据刷新到磁盘中进行永久化存储,但是这个刷新的过程可能会出错,那么更改的数据就会丢失,但在客户端提交事务时,就已经在更改缓冲池的数据之后告知客户端更改完成,这时候就出现了问题。而redo.log就是解决这个问题的。在客户端进行增删改时,会对缓冲池中的数据页进行增删改操作,在操作之后会将更改过的数据页即脏页立即刷新到redo log buffer中,在客户端提交事务之后,立即将redo log buffer中的脏页数据刷新到磁盘中的redo.log日志文件中,这样当后台线程将缓冲池中的数据刷新到磁盘出错时,就可以用redo.log中的数据进行数据恢复

为什么每一次提交事务的时候,要把数据刷新到redo log buffer中,而不是直接将buffer pool中的脏页刷新到磁盘中?这是因为直接将buffer pool中的数据刷新到磁盘中,存在严重的性能问题;在执行增删改操作时,所操作的数据在磁盘中的位置都是随机的,就涉及到了大量的随机磁盘IO,性能就比较低。而redo log buffer通过异步IO将数据刷新到磁盘中的redo.log日志文件中,日志文件都是在文件末尾追加数据的,此时就是顺序磁盘IO,性能就高于随机磁盘IO。

如果脏页中的数据已经顺利的刷新到磁盘中的ibd文件里,此时redo.log中的数据就已经没有用了,因为数据已经存在ibd文件中了,所以每隔一段时间就回去清理redo.log中的数据

undo.log 日志

解决事务的原子性

有两个作用:一是在事务执行失败进行回滚时需要用到undo.log,还有一个用于就是MVCC多版本并发控制 

MVCC 多版本并发控制

基本概念

视频教程: 基本概念

实现原理

记录中的隐藏字段

undo.log 日志

readview

视频教程:readview

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值