面试题答案
一键面试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记录:页目录中的最大记录,它在链表尾,同样不存储实际用户数据,用于标记链表结束位置。