一、逻辑存储架构
一个表空间对应的一个ibd文件,里面有许多段,其中包括数据段和索引段还有回滚段,在数据存储模型中的B+树中,叶子节点就是数据段进行存储的,非叶子节点就是索引段进行存储的,回滚段里存储了 undo log日志。然后里面还分为区->页->行
二、架构
1.内存结构
分为Buffer Pool缓冲池,Change Buffer更改缓冲区 Log Buffer 日志缓冲区 Adaptive Hash Index 自适应哈希索引。
1.缓冲池
进行增删改查数据直接进行操作缓存池的数据,如果没数据会将硬盘数据刷到内存中,然后如果对数据处理后它不回直接写进硬盘,而是先写到缓冲池,一定时候会写入硬盘中。
free page空闲page未被使用
clean page 被使用,数据还没修改过
dirty page 脏页,被使用被修改过 对应的块颜色依次变深
2.更改缓冲区
它针对于非一级索引的二级索引进行操作的,对于DML操作 后先同步到Buffer Pool再刷到硬盘中,为什么要这样,因为非唯一索引中如果进行随机顺序插入数据,那么节点内的数据可能会发送页分裂操作,这个操作会影响性能因为增加了与硬盘的IO操作。
3.自适应哈希索引
提供了一种hash索引结果,这种方式查数据快,但是不支持范围查询,自适应hash索引是系统自动建立的。
4.日志缓冲区
用来保存到硬盘中日志数据,定时刷新到硬盘中,例如redo log、undo log
2.硬盘结构
3.后台线程
在一定条件将内存中的数据刷到硬盘中。
三、事务原理
简单介绍一下ACID,事务的四大特性
原子性、一致性、持久性是通过redo log 和undo log进行管理的,隔离性通过锁和MVCC控制
1.redo log
我们正常在DML操作的时候开启事务进行操作,提交事务后就会将操作的数据刷到内存的缓冲池中,其中如果缓冲池中没数据就会从硬盘中的.ibd文件中读取到数据存到缓冲池中。然后此时已经提交事务,接着在一定时间以后后台线程会将缓冲池的数据刷到硬盘中,但是这个过程如果出错了,那么数据就会丢失。为了解决这个问题,在数据存到缓冲区的时候就记录一个到RedoLog buffer,在事务提交的时候会将RedoLog Buffer里的数据直接存到硬盘里。如果刷新到磁盘中出错了可以通过RedoLog存到硬盘中的 redo log file文件将数据恢复,这个文件不会永久保存定期会清除。该文件里存储的是物理日志。
2.undo log
回滚日志,在DML操作的时候出现,保证数据的原子性,提供回滚和MVCC中使用。 它使用的是逻辑日志,每一步的操作进行反向操作存储。如果事务提交了不需要回滚操作了,那么此时还会检查MVCC中是否使用了,不然不会将该文件删除。undo log 存储在段空间的回滚区
四、MVCC多版本并发控制
当前读就是读取到最新的版本,快照读是不加锁读取一个特定版本。
1.隐藏字段
每个数据实际上都有对应的隐藏字段。如果有主键 DB_ROW_ID不会生成。
2. undo log版本链
对应Undo log 如果进行insert操作,那么事务提交了不需要回滚了这个undo log就会删除。
但是如果 进行delete 和update 操作那么失误提交了也不会立即删除 undo log,因为MVCC正在使用。
undo log版本链,就是存储数据的时候先会存储一条记录,如果一个事务对数据进行修改删除一次那么会将之前这个记录存放到undolog里面,此时记录的事务id自增1,然后回滚指针指向版本链中记录的地址,每进行一次修改或者删除操作就会像版本链中加一条记录,并且他们通过回滚指针相连,最下边的是最老的数据,越靠上越新。
但是如果查询的时候返回具体哪个版本,根据readview来判断
3.ReadView
m_ids实际就是当前事务id min_trx_id实际就是最小活跃事务ID,max_trx_id就是最大活跃id+1 creator_trx_id显而易见。
判断是否可以访问对应的版本链依据:
RC条件下快照读每次都会生成readview
RR条件下仅在第一次执行快照读生成ReadView
标签:回滚,log,MYSQL,undo,MVCC,操作,InoDB,数据,硬盘 From: https://blog.csdn.net/m0_64022419/article/details/143756532