对小册《MySQL是怎样运行的》知识点的一些摘录。
InnoDB记录结构
行格式
-
InnoDB存储引擎支持四种行格式,分别是Compact、Redundant、Dynamic和Compressed -
可以在创建或修改表的语句中通过
ROW_FORMAT变量来指定行格式CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称 ALTER TABLE 表名 ROW_FORMAT=行格式名称
Compact行格式
Redundant行格式
Dynamic和Compressed行格式
-
这两种行格式类似于
COMPACT行格式,只是把所有的字节都存储到其他页面中,只在记录的真实数据处存储其他页面的地址 -
Compressed行格式会采用压缩算法对页面进行压缩
行溢出
-
MySQL支持变长字段,比如VARCHAR(M)、VARBINARY(M)、各种TEXT类型、各种BLOB类型 -
对于
Compact和Redundant行格式,如果变长字段的数据非常多,在本记录的真实数据处只会存储该列的前768个字节的数据和一个指向其他页的地址,然后把剩下的数据存放到溢出页中
InnoDB索引页结构
File Header
Page Header
Infimum + Supremum
-
Infimum + Supremum是两个虚拟的伪记录,分别表示页中的最小和最大记录,占固定的26字节 -
Infimum + Supremum与user records的记录构成单链表:-
规定
Infimum的下一条记录就是本页中主键值最小的用户记录 -
本页中主键值最大的用户记录的下一条记录就是
Supremum
-
Page Directory
-
记录在页中按照主键值由小到大顺序串联成一个单链表,为了根据主键值快速查找记录,
InnoDB对记录进行了分组:-
初始情况下
Infimum和Supremum分属于两个分组 -
每个组的最后一条记录的头信息中的
n_owned属性表示该组拥有多少条记录 -
将每个组的最后一条记录的地址偏移量单独提取出来按顺序存储到
Page Directory,页面目录中的这些地址偏移量被称为槽(英文名:Slot) -
每插入一条记录,都会从
Page Directory中找到主键值比本记录的主键值大并且差值最小的槽,然后把该槽对应的记录的n_owned值加1,直到该组中的记录数等于8个 -
在一个组中的记录数等于8个后再插入一条记录时,会将组中的记录拆分成两个组,并
Page Directory中新增一个槽来记录这个新增分组
-
-
根据主键值查找记录时,先通过二分法找到记录所在组的上一个组,然后沿单链表遍历找到目标记录
File Trailer
-
File Trailer用于检测页的完整性,由8字节组成,可以分为2个部分:-
前4个字节代表页的校验和
-
后4个字节代表页面被最后修改时对应的日志序列位置(LSN)
-