概览
逻辑存储结构
架构
当执行增删改查操作时,操作的是缓冲区的数据,如果缓冲区里没有要操作的数据,就会从磁盘中读取数据加载到缓冲区中;缓冲区的数据会以一定的频率通过后台线程刷新到磁盘中永久存储。
内存结构
磁盘结构
后台线程
后台线程的作用就是在合适的时机将内存缓冲池的数据刷新到磁盘文件当中
事务原理
基本概念
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