【MySQL】InnoDB数据页结构

InnoDB 了不同的目的而设计了不同类型的页 我们把用于存放记录的页称为数据页

一个数据页可以被大致划分7个部分,分别如下

  1. File Header:表示页的一些通用信息,占固定的 38 字节。
  2. Page Header:表示数据页专有的一些信息 占固定 56字节。
  3. lnfimum + Supremum:两个虚拟的伪记录,分别表示页中的最小记录和最大记录,占固定的 26 字节。
  4. User Records:真正存储我们插入的记录,大小不固定。
  5. Free Space:页中尚未使用的部分,大小不固定。
  6. Page Directory:页中某些记录的相对位置 ,也就是各个槽对应的记录在页面中的地址偏移量, 大小不固定 ,插入的记录越多,这个部分占用的空间就越多。
  7. File Trailer:用于检验页是否完整,占固定的8字节。

每个记录的头信息中都有一个 next record 属性,从而可以使页 中的所有记录串联成一个单向链表。

lnnoDB 会把页中的记录划分为若干个组,每个组的最后一个 录的地址偏移量作为一个槽,存放在 Page Directory中,一个槽占用 2 字节。

在一个数据页中查找指定主键值的记录时,分为两步。

  1. 通过二分法确定该记录所在分组对应的槽,并找到该糟所在分组中主键值最小的那条记录。
  2. 通过记录的 next ecord 属性遍历该槽所在的组中的各个记录。

每个数据页的 File Header 都有上一个页和下一个页的编号,所以所有的数据页会组成一个双向链表。

在将页从内存刷新到磁盘时,为了保证页的完整性,页首和页尾都会存储页中数据的校验和,以及页面最后修改时对应 LSN值(页尾只会存 LSN 值的后 4 字节) 。如果页首和页尾的校验和以及 LSN 值校验不成功,就说明刷新期间出现了问题。

总结:各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表。 每个数据页都会为存储在它里面的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录

—— 笔记,摘自《MySQL是怎样运行的》

你可能感兴趣的:(SQL,mysql)