Mysql InnoDB存储引擎的数据存储模型(3)

Mysql InnoDB存储引擎的数据存储模型

上一篇

256个数据区可以被划分为一个数据区组,多个数据区组形成了表空间的整体数据结构;这里需要简单了解一下的就是,一个表空间中、第一个数据区组中的第一个数据区、它的前三个数据页一般会存放一些特殊信息,其他数据区组中的第一个数据区的前两个数据页会放一些特殊的信息;当然这些特殊信息主要的作用还是为mysql的那些复杂机制的实现做铺垫而已,我们简单知道一下就行,表空间最终的结构大概如下图所示:

在这里插入图片描述

经过以上对一行数据、一个数据页、表空间的分析,我们通过一张流程图,整体看下一条数据在整个表空间的地位是怎样的:

在这里插入图片描述

【redo log和undo log的数据存储模型】
最后补充一下redo log和undo log数据存储模型相关的点,经过之前的文章的了解,我们都知道redo log保存了事务修改的信息,通过redo log我们可以在现场恢复事务,保证事务不丢失;undo log保存了事务开始前数据的旧版本的值,方便事务回滚时取到最近的一个版本的数据来恢复。

我们都知道正是因为redo log在事务提交后会及时的刷盘,才得以让我们提交的事务可靠性得到保障,现在 要探究的是,redo log是以怎样的数据结构来保存到磁盘的呢?其实redo log既然是存放事务修改的信息的,无非就是记录一些增删改操作的信息,我们就以修改操作举例,redo log至少得要记录一下本次修改的操作,是在哪个表空间中的哪个数据页中的具体什么位置修改了数据,而且具体修改了什么数据的值也要有记录,如下图所示:

在这里插入图片描述

redo log对于你一次修改数据的长度,定义了redo log的类型,比如你修改了1个字节的数据类型为:MLOG_ 1BYTE,修改了2个字节为:MLOG_2BYTE,修改4个字节为:MLOG_4BYTE,当然如果你一次修改了一大串数据,相应的redo log类型就为:MLOG_WRITE_STRING,所以当修改数据为一个字符串时,才需要知道具体修改了多长的数据的信息辅助,一条redo log日志数据结构大概看起来就如下图所示:

在这里插入图片描述

了解完redo log的数据结构后,还有一个问题就是redo log难道是一条一条这样写入到磁盘的吗?当然不是,这就像数据表中的一行数据一样需要先放到数据页,然后通过数据页存放到磁盘,类似思路,redo log这里也引入了redo log block来存放一条一条的redo log日志,每条redo log日志都是先存放在redo log block的body区中,如下图所示:

在这里插入图片描述

对于一个事务,一般都会有多条redo log日志信息,多条redo log日志信息存放在512字节的redo log block中的body中,当body中的496字节的内存存满后就存放下一个redo log block,然后这些redo log block会先存放在内存中的redo log buffer缓存中,默认大小为16MB,可通过参数innodb_log_buffer_size设置,然后到一定的时机再刷到磁盘文件中,redo log日志文件对应磁盘mysql安装目录下…/data/下的ib_logfile0和ib_logfile1这两个文件,默认只有两个文件,每个文件大小上限都为48MB,写完一个就写下一个循环着写,这也就意味着默认情况下,同一时刻最多只能存放96MB的redo log日志信息,如下图所示:

在这里插入图片描述

对于redo log最后再看下它的刷盘时机,一般有以下四种情况:
(1)如果一次性redo log buffer的内存超过一半,默认超过8MB:
该情况主要发生在高兵发场景,大量的事务执行导致一下子redo log buffer内存过大,直接导致刷盘;
(2)提交事务的情况下会刷盘
对于事务的提交,之前也了解了,只有依赖redo log刷盘持久化了才能保障事务的可靠性;
(3)后台线程定时会讲redo log buffer刷盘
这个类似buffer pool中lru链表刷盘一样,定时会有后台线程将redo log block数据顺序写入磁盘中;
(4)mysql停止服务时触发刷盘

最后简单看下undo log日志的结构,类似redo log,undo log也有主键(或复合主键),并且得记录主键的长度和值,方便取数时的定位;是在哪张表上的,得有表id,其他诸如日志类型、日志编号、开始结束等信息,如下图所示:

在这里插入图片描述

【mysql数据存储模型与buffer pool缓存】
经过以上对一行数据、一个数据页、表空间、redo log、undo log这些基本的数据结构的设计和分析之后,整体应该比较清晰了,最后我们回归到一条update语句,用一张图从整体角度将这些数据结构串起来看下执行的流程:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值