InnoDB存储引擎是Mysql数据库使用很广泛的一个存储引擎,底层的一些实现机制也值得我们去探究,它底层使用了很多的机制来保证数据的安全性与效率。本文所探究的主要是对脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log的刷新清理。
脏页
我们都知道我们执行更新操作,更改的是Buffer Pool中的页,该页再变为脏页,脏页刷新回磁盘是使用的CheckPoint技术,接下来就是脏页刷新回磁盘的一些触发条件:
- Master Thread 以秒为单位按一定条件刷新脏页(如果对IndoDB的Master Thread不了解的可以点击查看该文章,该文章详细介绍了Master Thread的执行流程)
- LRU 列表剩余空闲页不足100时,就移除LRU尾端的页,如果该页是脏页就会执行Check Point 刷新脏页
- Buffer Pool中脏页所占空间达到了Buffer Pool的总容量的75%也会刷新脏页
- Redo Log持久化文件中,未将脏页刷新回磁盘的Redo Log所占空间达到了总Redo Log持久化文件的75%
Redo Log
当我们执行更新语句后,会先生成Redo Log,再修改页,当数据库宕机后还有一些脏页未刷新会磁盘,就会造成数据的丢失,可以通过Redo Log来进行数据恢复,关于Redo Log 从内存中刷新至磁盘以及Redo Log持久化文件的清理工作:
- Master Thread 以秒为单位将内存中的Redo Log 刷新回磁盘文件中
- 事务提交,对应的Redo Log刷新回磁盘文件中
- Redo Log缓冲池中Redo Log所占空间超过总缓冲池中的空间的1/2回将Redo Log刷新回磁盘文件
- 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(合并)操作的情况:
- Master Thread 以秒为单位进行合并操作
- 当该非唯一非聚集索引再一次被使用时,也就是某条查询语句使用到了该索引,将该索引页从磁盘中读取出来至Buffer Pool中的时候
- Change Buffer底层结构就是一颗B+ Tree ,刚这颗B+ Tree可用空闲区域少于了总容量的1/32
还有一些其他我未总结到或有错误的期待欢迎大家留言指正。
|