MYSQL-->InnoDB引擎底层原理( 三 )


整个流程在增删改查的时候,会操作内存结构区域,如果里面没有数据就从 。磁盘结构中加载,然后进行操作 。
最后在特定时间会自动从内存结构中刷新到磁盘中 。在磁盘中进行持久化保存下来
事务原理事务事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交撤销操作请求 。
这些操作要么同时成功要么同时失败 。
事务的四大性质

  1. 原子性
    事务是不可分割的最小操作单元,要么全部成功,要么全部失败 。
  2. 一致性
    事务完成时,必须使所有的数据保持一致性 。
  3. 隔离性
    数据库系统提高隔离机制,保证事务在不受外部并发操作影响的独立环境运行 。
  4. 持久性
    事务一旦提交或回滚,他对数据库的数据改变就是永久的 。
事务的原理事务的原子性,一致性,持久性都是由redo log和undo log实现的
事务的隔离性是由 锁机制和MVCC实现的 。
redo log重做日志,记录的是事务提交时数据页的物理修改,用来实现事务的持久性 。
该日志文件由俩部分组成:
  1. 重做日志缓冲(redo log buffer)
    在内存中
  2. 重做日志文件(redo log file)
    在磁盘中
当事务提交后会把所有修改信息都存放到该日志文件中,用于在刷新脏页到磁盘中,发生错误时,进行数据的恢复 。
大概流程:
  1. 客户端A对innoDB存储引擎的表进行增删改事务操作
  2. 先访问内存结构中的缓冲池,如果增删改数据在其中不存在,
    就会从磁盘中读取数据再刷新到缓冲池(这个数据必须是唯一索引,否则会先进入到更改缓冲区)
  3. 在缓冲池中变成脏页,并记录在redolog buffer中,后直接刷新到磁盘中
  4. 如果脏页在一段时间后刷新到磁盘中报错了,可以通过redo log进行恢复 。

MYSQL-->InnoDB引擎底层原理

文章插图
使用redo log直接刷新到磁盘结构的好处
事务一般是一组多条的增删改查操作,故事务提交的时候会随机的操作多条的记录 。
这些记录会操作多条数据页,这样会产生大量的随机磁盘IO
而直接将redo log文件异步刷新到磁盘io中,由于它是日志文件,日志文件都是追加的,此时是顺序磁盘IO,这样会节约大量的磁盘IO
这种机制叫WAL(Write-Ahead Logging)(先写日志)
然后过一段时间脏页日志才会刷新到磁盘中 。
【MYSQL-->InnoDB引擎底层原理】故俩份日志是循环清理的
事务的redo log日志是为了解决脏页刷新到磁盘出错时进行数据的恢复使用的,用来保证数据的持久性
undo logundo log日志是用来保证事务的原子性的 。
undo log也叫回滚日志,用于记录数据被修改前的信息,作用为:提供回滚和MVCC
redo log记录的是物理日志!
undo log记录的是逻辑日志,可以认为当执行delete 一条记录时,undo log中会记录一条对应的insert记录,反之同理 。
当执行rollback时,就可以从undo log中的逻辑记录读取到对应内容,从而进行回滚 。
Undo log销毁
undo log在事务执行时产生,事务提交时,并不会马上删除undo log,因为这些日志可能还用于MVCC
Undo log存储
undo log采用,段的方式进行管理和记录,存放在前面介绍的rollback segment回滚中,内部包含了1024个undo log segment
这个段是逻辑存储结构的段哦~

经验总结扩展阅读