InnoDB磁盘结构主要包含表、索引、表空间、Doublwrite Buffer、Redo Log和Undo Logs,下面我们具体讲讲后面几项的作用。
1、表空间
表空间主要分为系统表空间
、File-Per-Table表空间
、General表空间
、Undo表空间
和临时表空间
。
- 系统表空间:针对Double write buffer和Change buffer的一块存储区域。如果表建立在系统表空间内,那么也会包含表和索引的数据。
- File-Per-Table表空间:过去InnoDB都是把表数据存储在系统表空间内,这种方式适用于专门用于数据库处理的机器,而File-Per-Table允许每个表数据都可以存储在自己的表空间数据文件里(.ibd文件)。默认都是用这种方式存储表数据。
-
General表空间:共享表空间,可以通过
CREATE TABLESPACE
语法创建共享表空间。 - Undo表空间:该表空间包含undo日志,通过该日志可以撤销事务对聚簇索引数据的最新修改,即我们常说的数据回滚。
- 临时表空间: 除了用于存放临时表数据,还会保存对临时表修改的回滚段。
2、Doublewrite Buffer(双写缓冲区)
双写缓冲区是位于系统表空间内的一块存储区域,InnoDB会在该存储区域完成Buffer Pool中已刷新的page写入。
为什么说叫做双写缓冲区呢?因为数据页在落地数据文件前,首先会往双写缓冲区写入数据,用来保证数据的完整性。
3、Redo Log
Redo log是一种基于磁盘的数据结构,主要用于未完成事务的数据恢复。Redo Log会编码更新表数据的请求,未完成更新数据文件的修改在数据库初始化期间自动重放。
默认情况下,Redo Log在磁盘上分为两个文件:ib_logfile0
和ib_logfile1
,MySQL将会循环写入数据到redo log文件中。
4、Undo Log
Undo log是与单个读写事务相关联的Undo log日志记录的集合,该日志会包含如何撤销事务最新修改的一些信息。
一个事务最多分配4个undo日志文件,每个日志文件对应的操作类型如下:
- 对表的INSERT操作。
- 对表的UPADATE和DELETE操作。
- 对临时表的INSERT操作。
- 对临时表的UPADATE和DELETE操作。