在InnoDB存储引擎表中,每张表都有个主键,如果在创建表时没有显示定义主键,则InnoDB存储引擎会按如下方式选择或创建主键:
l 首先表中是否有非空的唯一索引,若有则该列为主键
l 不符合上述条件,InnoDB存储引擎自动创建一个6字节大小的指针
InnoDB中所有数据都被逻辑地存放在一个空间中,称之为表空间,下图为InnoDB逻辑存储结构:
表空间由段、区、页组成
在启用innodb_file_per_table后,每张表的表空间内存放的只是数据、索引和插入缓冲,其它类的数据,如撤销信息(Undo),系统事务信息、二次写缓冲等还是存放在原来的共享表空间内(ibdata1)。
段:
由数据段、索引段和回滚段组成,
表空间由分散的页和段组成。
区:
区由64个连续的页组成,每个页大小16kB,即每个区大小为1M。
启用innodb_file_per_table后,创建默认大小为96KB的表,
按照区由64页组成,大小应该是1M?
这是由于每个段开始时,先有32页大小的碎片页来存放数据,当这些页使用完后才是64个连续页的申请。
实验:
先创建一个表:
其中col2部分大小为7000字节,这样,一页(16K)中可以放2个记录。
初始情况下有6页大小(96KB),见下图:
插入两条记录后,
INSERT INTO tt SELECT NULL, REPEAT(‘a’, 7000);
其中page level代表索引层,所以上图中有一个叶节点(page level为0)。
继续插入一条数据后:
先建立一个存储过程(用于生成60条插入语句,这样共插入63条,则会占有32页):
此时文件大小变成592KB(这里没有按照区的大小分配(1M)),共计592/16 = 37页。即新增31页。
这时用完了32KB的碎片页,如果再增加一条记录,那么会申请会是以区的方式进行空间申请。
现在变成2M大小
后面都会按照区的大小进行分配:
再增加2条记录后,发现大小变成9M,同时B-tree Node变成35个
页:
页是InnoDB磁盘管理的最小单位。大小为16KB,不可更改。
行:
每页最多存放16KB/2到200行记录
2、InnoDB物理存储结构
在将innodb_file_per_table设置为on后,每个表将独立地产生一个表空间文件,以ibd结尾,里面保存数据、索引、表的内部数据字典信息
表结构定义文件以frm结尾,这个文件与存储引擎无关。
3、InnoDB行记录格式
InnoDB中支持多种行记录格式,如Compressed、Dynamic、Compact以及Redybdant等
1)Compact行记录格式
在该格式中,不管是char还是varchar类型,NULL值是不占用存储空间的。
2)Redundant行记录格式
在该格式中,char类型的NULL是需要占用空间的,varchar的NULL不占用空间。
4、InnoDB数据页结构
http://www.cnblogs.com/crossapply/p/5455620.html