索引组织表
InnoDB存储引擎中,表都是按主键顺序组织存放的,这种按主键方式存储的表就叫做索引组织表。
在InnoDB的存储引擎表中,每个表都有主键,如果创建表时没定义主键,会按一下方式设定主键:
- 表中是否有非空的唯一索引,有则把第一个定义的定为主键
- 如果都不符合则自动创建一个6字节大小的指针来作为主键
InnoDB逻辑存储结构
所有数据都被逻辑地存放在一个空间,这个空间被称为表空间:
表空间
存储引擎逻辑结构的最高层
段
表空间由各个段组成,常见的段有数据段(B+树的叶子节点),索引段(B+树的非叶子节点),回滚段等
区
区是由连续页组成的空间,每个区的大小为1MB,一般InnoDB引擎一次从磁盘申请4-5个区,默认请款页大小为16KB,这时候一个区中有64个连续的页。当页大小改变是区的大小还是1MB
页
页时innoDB磁盘管理的最小单位。
页的常见类型有:
- 数据页(B+树叶子节点)
- undo 页(完整性用的)
- 系统页
- 事务数据页
- 插入缓冲bitmap页
- 插入缓冲空闲list页
- 未压缩的二进制大对象页
- 压缩的二进制大对象页
行
InnoDB中数据是按行来存放的,如果页大小是16KB,每个页最多允许存放16kb/2-200=7992行记录。
1.2.x版本默认使用Compact行记录格式来保存行:
- 变长字段长度列表:若列的长度小于255字节,大小为1字节,否则大小为2字节,表示的是对应变长列(比如vchar)的数据的实际大小,存储顺序是从后往前存。而固定长度类型(比如char)的列当实际长度小于设定长度时会用0x20来填充。
- NULL标志位:大小为1字节,bitmap标志位,从低到高顺序表示第n个bit对应的第n个列是否为NULL,1表示为NULL,(比如某一行有t1,t2,t3,t4 4个属性,其中t2,t3 为NULL,则NULL标志位的值为 00000110,即0x06,其中的1就是表示第二个,第3个属性为NULL)
- 记录头信息:固定5字节,含义如下图:next_record的值就是下一个记录的偏移量,这样就把页中的每一行弄成了链表的模式,每一行数据就是页链表中的一个node。
- 实际存储每个列的数据:NULL不占用该部分的任何数据
- 隐藏列:每行数据除了用户定义的列,还有两个隐藏列,事务ID列表(6字节)和回滚指针列(7字节),如果没有定义主键还会加一个6字节的rowid列
Redundant行记录格式
MySQL5.0版本之前InnoDB的行记录方式。目的是为了兼容之前版本页的页格式,格式如下: