MYSQL技术内幕-innoDB存储引擎 第四章 表
索引组织表
表根据主键顺序组织存放,这种表称为索引组织表
如果没有显式定义主键,innoDB会按照如下方式选择或创建主键:
1 判断是否有非空的唯一索引,如果有,该列为主键
2 自动创建一个6字节大小的指针
InnoDB逻辑存储结构
所有数据都被逻辑地存放在一个空间中,称为表空间。表空间由段,区,页(块)组成
1 表空间
innoDB存储引擎逻辑结构的最高层,默认有一个共享表空间,所有数据都放在表空间。通过参数配置,可让每张表的数据放在单独的表空间内
2 段
表空间由各种段组成,常见的有数据段,索引段,回滚段等。
3 区
区是由连续页组成的空间,任何情况下,区的大小都是1M。为了保证区中页的连续性,innoDB一次从磁盘申请4~5个区。
4 页
页是innoDB磁盘管理的最小单位,默认大小为16k,所以一个区有64个连续的页
1.0.x版本引入压缩页,可设置为2k,4k,8k,那每个区对应的页就是512,256,128
1.2.x版本可通过配置将页设置为4k,8k,但是页中数据不压缩。设置之后所有表中页大小都是一样的,而且不可以再次进行修改,除非产生新库
常见页类型:
(1)数据页 B-tree Node
(2)undo页 undo Log Page
(3)系统页 System Page
(4)事务数据页 transaction system page
(5)插入缓冲位图页 insert buffer bitmap
(6)插入缓冲空闲列表页 insert buffer free list
(7)未压缩的二进制大对象页 uncompressed BLOB page
(8)压缩的二进制大对象页 compressed BLOB page
5 行
每个页最多允许存放16k/2~200行的记录,即7992行记录
行记录格式
1 compact
mysql5.0引入的,高效地存储数据,因为一个页中存放的行数据越多,性能越高
2 redundant
mysql5.0之前的存储方式,
3 行溢出数据
一般BLOB,LOB的大对象会把数据存放在数据页面之外,但是BlOB也可以不将数据放在溢出页面,varchar数据类型,也有可能存放为行溢出数据
4 compressed和dynamic
1.0.x引入新的文件格式
5 char的行结构存储
对未能占满长度的填充0x20
在多字节字符集的情况下,char和varchar的实际存储基本没有区别
innoDB数据页结构
数据页由以下部分组成
(1)file header 文件头
38字节,大小固定,记录页的一些头信息,包括上下页
(2)page header 页头
56字节,大小固定,记录页的状态信息,
(3)infimun和supremum records
两个虚拟的行记录,用来限定记录的边界,
infimun比页中任何主键都小
supremum records比任何可能大的值都大
(4)user records 用户记录,即行记录
(5)free space 空闲空间
链表
(6)page directory 页目录
B+树索引只能找到记录所在的页,然后通过page directory进行二叉查找
(7)file trailer 文件结尾信息
8字节,大小固定,为了检测页是否完整
named file formats机制
解决不同版本下页结构兼容性的问题
约束
1 数据完整性
5 enum和set约束
视图
分区表

浙公网安备 33010602011771号