本篇是继续上1篇未完的部份继续说的。
4.InnoDB数据页结构
页是InnoDB存储引擎管理数据库的最小磁盘单位。页类型为B-tree Node的页寄存的就是表中行的实际数据。页由以下7个部份组成:File Header(文件头)、Page Header(页头)、Infimun和Supremum Records、User Records(行记录)、Free Space(空闲空间)、Page Directory(页目录)和File Trailer(文件尾)。 以下图:
其中File Header、Page Header和File Trailer的大小是固定的,分别为38、56、8字节,用来标记该页的1些信息,如checksum,数据页所在B+树索引的层数等。User Records、Free Space和Page Directory这些部份为实际的行记录存储空间,因此大小是动态的。下边分别介绍1下各部份
A.File Header
File Header用来记录1些页的头信息,由8个部份组成,共占用38字节。以下图:
其中FIL_PAGE_TYPE的具体类型以下图:
B.Page Header
Page Header用来记录数据页的1些状态信息,由14个部份组成,共占用56字节。以下图:
C.Infimun和Supremum
在InnoDB存储引擎中,每一个数据页都有两个虚拟的行记录,用来限定记录的边界。Infimun记录是比该页中任何主键都要小的值,Supremum指比任何可能大的值还要大。都是在页创建时被建立,并且在任何情况下都不会被删除。在Compact和Redundant行格式下,占用的字节数不想同。以下图:
D.User Record和Free Space
User Record就是实际存储行记录的内容。Free Space指空闲空间,一样也是1个链表数据结构,在1条数据被删除后,该空间会加入到空闲链表中。
E.Page Directory
Page Directory中寄存了记录的相对位置(是页相对位置而不是偏移量),有些时候这些记录指针称为Slots(槽)或Directory Slots(目录槽)。在InnoDB存储引擎的槽是1个稀疏目录(spare directory),即1个槽中可能包括多个记录。伪记录Infimum的n_owned值总是1,记录Supremum的n_owned的取值范围为[1,8],其他用户记录n_owned的取值范围[4,8]。当记录被插入或删除时需要对槽进行分裂或平衡的保护操作。在Slots中记录是依照索引键值进行寄存的,这个模样可以利用2叉查找迅速找到记录的指针。由于InnoDB存储引擎中Page
Directory是稀疏目录,2叉查找的结果是1个粗略的结果,因此InnoDB存储引擎必须通过record header中的next_record来继续查找相干记录。B+树索引本身其实不能找到具体的1条记录,能找到只是该记录所在的页。数据库把页载入到内存中,然后通过Page Directory在进行2叉查找。2叉查找的时间复杂度很低,同时在内存中的查找很快,因此通常疏忽这部份查找所用的时间。
F.File Trailer
为了检查页是不是已完全的写入磁盘(如可能产生的写入进程中磁盘破坏、机器关机等),InnoDB存储引擎的页设置了File Trailer部份。File Trailer只有1个FIL_PAGE_END_LSN部份,占用8字节。前4字节代表该页的checksum值,最后4字节和File Header中的FIL_PAGE_LSN相同。将这两个值与File Header中的FIL_PAGE_SPACE_OR_CHECKSUM和FIL_PAGE_LSN值进行比较,看是不是1致(checksum的比较需要通过InnoDB的checksum函数来进行比较,不是简单的等值比较),以此来保证页的完全性。
在默许配置下,InnoDB存储引擎每次从磁盘读取1个页就会检测该页的完全性,即页是不是产生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)是1个命名的虚表,由1个SQL查询来定义,可以当作表使用,与持久表不同的是,视图中的数据没有实际的物理存储。在实际的开发中几近都没有用过,疏忽了~~
7.分区表
分区的进程是将1个表或索引分解为多个更小、更可管理的部份。目前MySQL数据库只支持水平分区,其实不支持垂直分区。在实际的开发中几近都没有用过,疏忽了~~