本章将从InnoDB存储引擎表的逻辑存储及实验开始进行介绍,然后将重点分析表的物理存储特征,即数据在表中是如何组织和存放的。简单的来说,表就是关于特定实体的数据集合,这也是关系型数据库的核心。
4.1索引组织表
在创建表时没有显式地定义主键,会按照如下进行创建主键:
1.首先判断表中是否有非空的索引的唯一索引。如果有,则该列为主键
2.如果不符合以上条件就会,自动创建一个6字节大小的指针
3.如果存在多个非空唯一索引(UNIQUE KEY(X)),就会根据定义的第一个索引为主键
4.2InnoDB逻辑存储结构
所有带数据都被逻辑的存放在一个空间里,称为表空间,表空间:表空间--->段--->区--->块--->行
表空间可以看做是InnoDB中最高层,所有的数据都存放在表空间中。默认情况下InnoDB有一个共享表空间ibdatal,所有数据都存放在这个表空间里面,如果开启了参数innode_file_per_table这个参数就会将数据存放在单独的一个空间里面。
表空间是由各个段组成的,常见的段有数据段(索引),索引段,回滚段等,InnoDB存储引擎是由索引组织的,因此数据就是索引,对段的管理都是由InnoDB自己完成的
区是由连续页组成的空间,在任何情况下每一个区的大小都为1MB,为了保证区中页的连续性,InnoDB存储引擎一次从磁盘中申请4~5个区,一个区中默认有64个16KB的连续页。每个页的大小可以进行压缩,但是总数为1MB是不变的。
如果是开启了innode_file_per_table参数就会先使用碎片页。
页是InnoDB中最小的单位,常见的页有以下:
行:数据是按照行进行存放的,默认最多放到7992条记录,InnoDB提供了两种记录行的方法:Compact和Redundant。其中Compact
compace行记录格式的首部是一个非NULL变长字段长度列表,而且是按照列的顺序逆序放置的。若列的长度小于255字节,用1字节表示。如果大于255就用2字节表示(因为VARCHAR的最大长度限制为65535)。
NULL标志位是为了指示是否有NULL值,如果有则为1.
记录头信息:固定占用5字节(40位):
最后的部分就是实际存储每一行中列的数据,NULL不占任何空间。
按照书上的分析一段:
从0000c078开始看
可以看出03 02 01是逆序的 03 02 01代表的是63 62 61
固定长度Char没有沾满的时候会使用0x20来进行填充
0x2c表示下一个记录的偏移量,是使用链表的结构来串联各个行记录的
4.4数据页结构
页类型为B-tree-Node的页存放的就是表中行的实际数据了。
文件头记录了有关页的信息
而页头记录了大部分数据的信息
File Header 字段用于记录 Page 的头信息,其中比较重要的是 FIL_PAGE_PREV 和 FIL_PAGE_NEXT 字段,通过这两个字段,我们可以找到该页的上一页和下一页,实际上所有页通过两个字段可以形成一条双向链表。Page Header 字段用于记录 Page 的状态信息。接下来的 Infimum 和 Supremum 是两个伪行记录,Infimum(下确界)记录比该页中任何主键值都要小的值,Supremum (上确界)记录比该页中任何主键值都要大的值,这个伪记录分别构成了页中记录的边界。
页头里面包含了大部分的页信息。