接上:https://blog.csdn.net/qq_32250495/article/details/99099152
四、表
4.1 索引组织表。在innoDB中,表都是按照主键顺序组织存放的,这种存储方式的表称为索引组织表。innoDB会按照如下方式选择或创建主键:
首先判断表中是否有非空的唯一索引,如果有则为主键。如果没有则innnoDB自动创建一个6字节大小的指针。
4.2 innoDB逻辑存储结构
从逻辑上来看,innodb所有的数据都被逻辑的放在一个空间中,称为表空间。表空间又由段、区、页组成。
表空间:innodb有一个共享的表空间ibdata1,如果配置一下参数,可以使每张表都有一个表空间,用于存放数据、索引和插入缓冲的bitmap页,其他数据,如果回滚段、插入缓冲索引、系统事务、二次写缓冲依然在共享表空间中。
段:表空间由段组成,常见的段有数据段,索引段,回滚段。由于innoDB的表示索引组织的,所以数据就是B+树所以的叶子节点,索引就是B+树的非叶子节点。
区:区是由连续页组成的空间。每个区大小为1MB,为了保证区的连续性,innoDB一次从磁盘申请4-5个区。默认情况下innoDB存储引擎页的大小为16KB,即一个区由64个连续的页。innoDB段在初始分配的时候只有32个碎片页,只有在超过该大小后才连续分配。
页:页是innoDB磁盘管理的最小单位。
行:页中按照行存放数据,每个页最多存储7992行记录。
4.3 行格式
在老的版本中使用称为 antelope(Compact, Redundent)的文件格式,在新版本开始使用barracuda(Compressed,Dynamic)的文件格式
Compact行记录格式:变长字段长度列表(1-2字节),null标志位(1字节),记录头信息(5字节),事务ID列,回滚指针列,列数据。回滚指针列记录了undo log中的数据。页中所有行都通过链表串联起来。
Redundent行记录格式:变长字段长度列表。记录头信息(6字节),列1,列2... 该格式是数据库5.0之前的版本格式。
新的记录格式对于blob数据完全采用行溢出的方式。数据页中只存放20个字节的指针。Compressed格式会压缩blob页。
4.4 行溢出数据
根据行格式定义可知,一行记录可以创建65535字节大小。但是数据页为16K,无法存储这么大的数据,当数据发生行溢出时候,数据存放在blob页中。而真正的数据页只保存了768字节的前缀数据,之后是偏移量,指向行溢出页。
innoDB存储引擎表是按照B+树组织的,所以每页数据中至少包含2条记录。如果页中足够存放两条数据,则不会存放到blob页中。
4.5 页结构
数据页可由7个部分组成。
File Header。 文件头用来记录页的一些头信息。占用38个字节。checksum(4