MST

星途 面试题库

面试题:MySQL InnoDB数据页中记录是如何在页内进行组织的

请详细描述MySQL InnoDB数据页中记录在页内的组织方式,包括记录头信息、记录类型等相关内容。
21.8万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

1. 记录在页内的组织方式

InnoDB数据页中的记录是按照单向链表的方式组织的。每个记录除了存储实际的数据外,还包含一些额外的信息用于链表的维护。链表的头节点和尾节点分别是页目录中的Infimum和Supremum记录,它们并不是真正存储用户数据的记录,而是用于标识链表边界。其他实际存储用户数据的记录通过指针连接在这个链表中。

2. 记录头信息

记录头信息占用5字节(40位),包含以下重要信息:

  • 预留位1(1位):目前没有使用,固定为0。
  • 预留位2(1位):目前没有使用,固定为0。
  • delete_mask(1位):用于标记该记录是否被删除。如果为1,表示该记录已被删除,但在未进行purge操作前,该记录仍会占用空间。
  • min_rec_mask(1位):B+树非叶子节点中,标记是否为最小记录。
  • n_owned(4位):表示该记录拥有的记录数。在页目录中,一个槽(slot)可以指向多个记录,该字段用于表示一个槽指向的一组记录中,该记录是其中第几个。
  • heap_no(13位):表示该记录在堆中的位置。从0开始计数,Infimum记录的heap_no为0,Supremum记录的heap_no为1,之后实际用户记录的heap_no从2开始递增。
  • record_type(3位):记录类型,取值如下:
    • 0:普通的用户记录。
    • 1:B+树非叶子节点记录。
    • 2:Infimum记录。
    • 3:Supremum记录。
  • next_record(16位):指向下一条记录的相对位置。通过该指针将所有记录连接成单向链表。

3. 记录类型

  • 普通用户记录:存储用户插入到表中的实际数据,每个记录包含用户定义的列值以及可能存在的隐藏列(如row_id、transaction_id、roll_pointer等)。
  • B+树非叶子节点记录:用于构建B+树的索引结构,不存储实际的用户数据,而是存储键值和指向子节点的指针,用于快速定位数据所在的子树。
  • Infimum记录:页目录中的最小记录,它在链表头,不存储实际用户数据,仅用于标记链表起始位置。
  • Supremum记录:页目录中的最大记录,它在链表尾,同样不存储实际用户数据,用于标记链表结束位置。