目录
1、逻辑存储结构
- 表空间 一个MySQL实例可以有多个表空间(xxx.ibd文件)用于存储户记录和索引
- 段 段分为数据段、索引段、回滚段,InnoDB是索引组织表,数据段就是B+树的叶子结点,索引段就是非叶子结点。段用来管理多个区
- 区 表空间的单元结构,每个区1M
- 页 InnoDB存储引擎磁盘管理的最小单元,每个页16k
- 行 InnoDB存储引擎数据是按行进行存放的
2、架构
MySQL5.5版本开始,默认使用InnoDB存储引擎,因为它擅长事务、具有崩溃恢复的特性
-
内存结构
缓冲区可以有效降低磁盘IO操作
-
磁盘结构
-
后台线程
3、事务原理
事务:一组操作的集合,要么同时成功,要么同时失败
- redo.log
该日志文件由两部分组成:重做日志缓冲和重做日志文件,前者在内存,后者在磁盘中。当事务提交后会把所有修改信息都存到该日志文件中,用于刷新脏页到磁盘,发生错误时,互进行数据恢复,保证了数据的持久性
- undo.log
回滚日志,用于记录数据被修改前的信息,作用:提供回滚和MVCC多版本并发控制,它是逻辑日志,并非是实际的记录(类似Redis AOF)
Undo Log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除,因为这些日志可能还用于MVCC
Undo Log存储:undo log采用段的方式进行管理和记录,存放在rollback segment回滚段中,内部包含了1024个undo log segment
4、MVCC
MVCC基本概念
- 当前读
读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前读记录
- 快照读
简单的select(不加锁)就是快照读,读取的是记录数据的可见版本,有可能是历史数据
- MVCC
全称 Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐式字段、undo Log日志、readView
MVC实现原理
- 记录中的隐藏字段
DB_TRX_ID 最近修改事务ID
DB_ROLL_PIR 回滚指针,指向这条记录的上一个版本,用于配合undo Log日志
DB_ROW-_ID 隐藏主键,如果表结果没有指定主键,将会生成该隐藏字段
- undo Log版本链
多个并发事务修改同一条记录,就会形成一个修改前的记录单链表
- readView(数据版本读取的判断规则的集合)
ReadView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交)ID
总结
- InnoDB逻辑存储结构
表空间、段、区、页、行
- InnoDB架构
内存结构
磁盘结构
后台线程
- 事务原理
A 原子性 undoLog
C 一致性 redoLog + undoLog
I 隔离性 MVCC+锁
D 持久性 redoLog
- MVCC
隐藏字段+undoLog版本链+ReadView
保证每一次快照读所读取的记录为某一个历史版本