本篇是继续上一篇未完的部分继续说的。
4.InnoDB数据页结构
页是InnoDB存储引擎管理数据库的最小磁盘单位。页类型为B-tree Node的页存放的就是表中行的实际数据。页由以下七个部分组成:File Header(文件头)、Page Header(页头)、Infimun和Supremum Records、User Records(行记录)、Free Space(空闲空间)、Page Directory(页目录)和File Trailer(文件尾)。 如下图:
其中File Header、Page Header和File Trailer的大小是固定的,分别为38、56、8字节,用来标记该页的一些信息,如checksum,数据页所在B+树索引的层数等。User Records、Free Space和Page Directory这些部分为实际的行记录存储空间,因此大小是动态的。下边分别介绍一下各部分
A.File Header
File Header用来记录一些页的头信息,由8个部分组成,共占用38字节。如下图:
其中FIL_PAGE_TYPE的具体类型如下图:
B.Page Header
Page Header用来记录数据页的一些状态信息,由14个部分组成,共占用56字节。如下图:
C.Infimun和Supremum
在InnoDB存储引擎中,每个数据页都有两个虚拟的行记录,用来限定记录的边界。Infimun记录是比该页中任何主键都要小的值,Supremum指比任何可能大的值还要大。都是在页创建时被建立,并且在任何情况下都不会被删除。在Compact和Redundant行格式下,占用的字节数不想同。如下图:
D.User Record和Free Space
User Record就是实际存储行记录的内容。Free Space指空闲空间,同样也是一个链表数据结构,在一条数据被删除后,该空间会加入到空闲链表中。
E.Page Directory
Page Directory中存放了记录的相对位置(是页相对位置而不是偏移量),有些时候这些记录指针称为Slots(槽)或者Directory Slots(目录槽)。在InnoDB存储引擎的槽是一个稀疏目录(spare directory),即一个槽中可能包含多个记录。伪记录Infimum的n_owned值总是1,记录Supremum的n_owned的取值范围为[1,8],其他用户记录n_owned的取值范围[4,8]。当记录被插入或者删除时需要对槽进行分裂或平衡的维护操作。在Slots中记录是按照索引键值进行存放的,这个样子可以利用二叉查找迅速找到记录的指针。由于InnoDB存储引擎中Page Directory是稀疏目录,二叉查找的结果是一个粗略的结果,因此InnoDB存储引擎必须通过record header中的next_record来继续查找相关记录。B+树索引本身并不能找到具体的一条记录,能找到只是该记录所在的页。数据库把页载入到内存中,然后通过Page Directory在进行二叉查找。二叉查找的时间复杂度很低,同时在内存中的查找很快,因此通常忽略这部分查找所用的时间。
F.File Trailer
为了检查页是否已经完整的写入磁盘(如可能发生的写入过程中磁盘损坏、机器关机等),InnoDB存储引擎的页设置了File Trailer部分。File Trailer只有一个FIL_PAGE_END_LSN部分,占用8字节。前4字节代表该页的checksum值,最后4字节和File Header中的FIL_PAGE_LSN相同。将这两个值与File Header中的FIL_PAGE_SPACE_OR_CHECKSUM和FIL_PAGE_LSN值进行比较,看是否一致(checksum的比较需要通过InnoDB的checksum函数来进行比较,不是简单的等值比较),以此来保证页的完整性。
在默认配置下,InnoDB存储引擎每次从磁盘读取一个页就会检测该页的完整性,即页是否发生Corrupt。用户可以通过参数innodb_checksums来开启或者关闭这个页完整性的检查。MySQL 5.6.6版本开始新增参数innodb_checksum_algorithm来设置checksum函数的算法。默认为crc32,可以设置的值有:innodb、crc32、none、strict_innodb、strict_crc32、strict_none.
5.Named File Formats机制
随着InnoDB存储引擎的发展,新的页数据结构有时用来支撑新的功能特性。如InnoDB 1.0.X版本提供了新的页数据结构来支持表压缩功能,完全的溢出(Off page)大变长字符类型字段的存储。这些新的页数据结构和之前版本的页并不兼容,因此InnoDB存储引擎通过Named File Formats机制来解决不同版本之间的兼容性。通过参数innodb_file_format设置文件格式。通过参数innodb_file_format_check来检测当前InnoDB存储引擎文件格式的支持度,默认为ON。
6.视图
视图(view)是一个命名的虚表,由一个SQL查询来定义,可以当做表使用,与持久表不同的是,视图中的数据没有实际的物理存储。在实际的开发中几乎都没有用过,忽略了~~
7.分区表
分区的过程是将一个表或者索引分解为多个更小、更可管理的部分。目前MySQL数据库只支持水平分区,并不支持垂直分区。在实际的开发中几乎都没有用过,忽略了~~