《MySQL技术内幕:InnoDB存储引擎》读书笔记三-表

在InnoDB存储引擎表中,每张表都有个主键,如果在创建表时没有显示定义主键,则InnoDB存储引擎会按如下方式选择或创建主键:

首先表中是否有非空的唯一索引,若有则该列为主键

不符合上述条件,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行记录

2InnoDB物理存储结构

在将innodb_file_per_table设置为on后,每个表将独立地产生一个表空间文件,以ibd结尾,里面保存数据、索引、表的内部数据字典信息

表结构定义文件以frm结尾,这个文件与存储引擎无关。

 

3InnoDB行记录格式

 

InnoDB中支持多种行记录格式,如Compressed、Dynamic、Compact以及Redybdant等

1)Compact行记录格式

在该格式中,不管是char还是varchar类型,NULL值是不占用存储空间的。

2)Redundant行记录格式

在该格式中,char类型的NULL是需要占用空间的,varchar的NULL不占用空间。

4InnoDB数据页结构

http://www.cnblogs.com/crossapply/p/5455620.html

 

 

转载于:https://my.oschina.net/u/1015154/blog/802585

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值