MST

星途 面试题库

面试题:MySQL InnoDB COMPACT行格式中数据如何存储

在MySQL InnoDB COMPACT行格式下,请阐述普通记录和页目录是如何存储数据的,以及它们之间的关联关系。
13.8万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

普通记录存储

  1. 变长字段长度列表:记录了变长字段(如 VARCHAR、TEXT 等类型字段)的长度。按照字段在表结构中的顺序逆序存放,每个变长字段长度占用的字节数取决于其实际长度,比如小于 255 字节用 1 字节表示,大于等于 255 字节用 2 字节表示。
  2. NULL值列表:用来标记该行记录中哪些列的值为 NULL。如果表中没有可为 NULL 的列,则不存在该部分。以二进制位的形式存储,每个二进制位对应表中的一列,值为 1 表示该列值为 NULL,0 表示不为 NULL。同样按照列在表结构中的顺序逆序存放,并且占用的字节数需要向上取整到字节。
  3. 记录头信息:固定占用 5 字节,包含了很多关于这条记录的重要信息,如记录的删除标记、记录类型(普通记录、最小记录、最大记录等)、记录的真实数据头地址相对于记录头的偏移量等。
  4. 真实数据:存放该行记录各个列的实际数据值,不包括隐藏列(如 row_idtransaction_idroll_pointer)。按照表结构中列的顺序依次存放。

页目录存储

  1. :页目录是由若干个槽组成,每个槽都对应着一条记录的位置。槽是稀疏存储的,并不是每个记录都对应一个槽,而是若干条记录对应一个槽。
  2. 槽的组织方式:页目录中的槽按照记录的主键值(如果没有主键,则按照唯一键,若都没有则按照 InnoDB 自动生成的 row_id)从小到大顺序排列。通过这种有序的组织方式,可以利用二分查找法快速定位到目标记录所在的槽,进而找到目标记录。

关联关系

  1. 记录与槽的关联:普通记录通过其记录头信息中的一些标志位等信息,与页目录中的槽建立关联。页目录中的槽记录了对应记录在页中的相对位置,这样通过槽可以快速找到普通记录。
  2. 槽的定位:在查找记录时,首先在页目录中通过二分查找找到合适的槽,因为槽是按照记录主键值有序排列的。找到槽后,再在槽对应的记录范围内顺序查找具体的目标记录。这样的设计既利用了页目录的有序性快速缩小查找范围,又通过记录范围的顺序查找确保能找到精确的记录,从而实现了在页内高效地定位和访问普通记录。