Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log

文章目录

  • 脏页
  • Redo Log
  • Undo Log
  • Insert Buffer 或 Change Buffer

InnoDB存储引擎是Mysql数据库使用很广泛的一个存储引擎,底层的一些实现机制也值得我们去探究,它底层使用了很多的机制来保证数据的安全性与效率。本文所探究的主要是对脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log的刷新清理。

脏页

我们都知道我们执行更新操作,更改的是Buffer Pool中的页,该页再变为脏页,脏页刷新回磁盘是使用的CheckPoint技术,接下来就是脏页刷新回磁盘的一些触发条件:

  1. Master Thread 以秒为单位按一定条件刷新脏页(如果对IndoDB的Master Thread不了解的可以点击查看该文章,该文章详细介绍了Master Thread的执行流程)
  2. LRU 列表剩余空闲页不足100时,就移除LRU尾端的页,如果该页是脏页就会执行Check Point 刷新脏页
  3. Buffer Pool中脏页所占空间达到了Buffer Pool的总容量的75%也会刷新脏页
  4. Redo Log持久化文件中,未将脏页刷新回磁盘的Redo Log所占空间达到了总Redo Log持久化文件的75%

Redo Log

当我们执行更新语句后,会先生成Redo Log,再修改页,当数据库宕机后还有一些脏页未刷新会磁盘,就会造成数据的丢失,可以通过Redo Log来进行数据恢复,关于Redo Log 从内存中刷新至磁盘以及Redo Log持久化文件的清理工作:

  1. Master Thread 以秒为单位将内存中的Redo Log 刷新回磁盘文件中
  2. 事务提交,对应的Redo Log刷新回磁盘文件中
  3. Redo Log缓冲池中Redo Log所占空间超过总缓冲池中的空间的1/2回将Redo Log刷新回磁盘文件
  4. Redo Log持久化文件中会有被重用的部分允许覆盖重用,当不可重用的部分所占空间超过了总文件空间的75%时,会刷新Buffer Pool中的脏页,进而让Redo Log持久化文件中有更多的可重用部分。

Undo Log

Undo Log 的作用是我们执行事务回滚时,恢复至原始数据。Master Thread线程会已秒为单位进行Undo Log的清理工作


Insert Buffer 或 Change Buffer

还是执行更新操作,更新了数据的同时还需要更新相对应的索引页,但这样更新操作的效率就会变的很慢,因为还需要从磁盘中读取相应的索引页到Buffer Pool中,很多时候还会读取很多索引页。针对该问题InnoDB存储引擎将更新索引页推辞了,并不是在更新数据的同时更新索引页,而是先暂时保存至Change Buffer 中,然后再根据一些情况进行merge(合并)操作。

进入Change Buffer的索引页也有一个条件:非唯一非聚集索引

对Insert Buffer 或 Change Buffer进行merge(合并)操作的情况:

  1. Master Thread 以秒为单位进行合并操作
  2. 当该非唯一非聚集索引再一次被使用时,也就是某条查询语句使用到了该索引,将该索引页从磁盘中读取出来至Buffer Pool中的时候
  3. Change Buffer底层结构就是一颗B+ Tree ,刚这颗B+ Tree可用空闲区域少于了总容量的1/32

还有一些其他我未总结到或有错误的期待欢迎大家留言指正。

你可能感兴趣的:(Mysql,数据库,mysql,database)