阅读 235

《MySQL是怎样运行的》笔记(二)

对小册《MySQL是怎样运行的》知识点的一些摘录。

InnoDB记录结构

行格式

  • InnoDB存储引擎支持四种行格式,分别是CompactRedundantDynamicCompressed

  • 可以在创建或修改表的语句中通过ROW_FORMAT变量来指定行格式

    CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称
    ALTER TABLE 表名 ROW_FORMAT=行格式名称
    复制代码

Compact行格式

Redundant行格式

Dynamic和Compressed行格式

  • 这两种行格式类似于COMPACT行格式,只是把所有的字节都存储到其他页面中,只在记录的真实数据处存储其他页面的地址

  • Compressed行格式会采用压缩算法对页面进行压缩

行溢出

  • MySQL支持变长字段,比如VARCHAR(M)VARBINARY(M)、各种TEXT类型、各种BLOB类型

  • 对于CompactRedundant行格式,如果变长字段的数据非常多,在本记录的真实数据处只会存储该列的前768个字节的数据和一个指向其他页的地址,然后把剩下的数据存放到溢出页中

 

InnoDB索引页结构

File Header

Page Header

Infimum + Supremum

  • Infimum + Supremum是两个虚拟的伪记录,分别表示页中的最小和最大记录,占固定的26字节

  • Infimum + Supremumuser records的记录构成单链表:

    • 规定Infimum的下一条记录就是本页中主键值最小的用户记录

    • 本页中主键值最大的用户记录的下一条记录就是Supremum

Page Directory

  • 记录在页中按照主键值由小到大顺序串联成一个单链表,为了根据主键值快速查找记录,InnoDB对记录进行了分组:

    • 初始情况下InfimumSupremum分属于两个分组

    • 每个组的最后一条记录的头信息中的n_owned属性表示该组拥有多少条记录

    • 将每个组的最后一条记录的地址偏移量单独提取出来按顺序存储到Page Directory,页面目录中的这些地址偏移量被称为(英文名:Slot

    • 每插入一条记录,都会从Page Directory中找到主键值比本记录的主键值大并且差值最小的槽,然后把该槽对应的记录的n_owned值加1,直到该组中的记录数等于8个

    • 在一个组中的记录数等于8个后再插入一条记录时,会将组中的记录拆分成两个组,并Page Directory中新增一个槽来记录这个新增分组

  • 根据主键值查找记录时,先通过二分法找到记录所在组的上一个组,然后沿单链表遍历找到目标记录

File Trailer

  • File Trailer用于检测页的完整性,由8字节组成,可以分为2个部分:

    • 前4个字节代表页的校验和

    • 后4个字节代表页面被最后修改时对应的日志序列位置(LSN)

文章分类
阅读
文章标签