IT袋

当前位置:主页 > 经验教程 > 硬件教程 >

InnoDB磁盘结构详解

InnoDB磁盘结构详解 深入探究InnoDB的磁盘结构(2)

时间:2023-09-23 23:35:19 来源:IT袋 作者:苏晓敏
导读:InnoDB磁盘结构详解,页 页是InnoDB中管理数据的最小单元,是固定大小的一段连续磁盘空间,默认为 16KB ,用于存放数据、索引等各种类型的数据。 InnoDB中,常见的页类型有数

InnoDB磁盘结构详解

页是InnoDB中管理数据的最小单元,是固定大小的一段连续磁盘空间,默认为16KB,用于存放数据、索引等各种类型的数据。

InnoDB中,常见的页类型有数据索引页、undo page、文件管理页FSP_HDR/XDES、插入缓冲IBUF_BITMAP页、INODE页等。

在InnoDB中的设计中,页与页之间是通过一个双向链表连接起来,而存储在页中的数据行则是通过单链表连接起来的,如下图:

InnoDB磁盘结构详解

双向链表

页有通用的文件头和尾(将页的内容进行封装,通过文件头和文件尾的checksum方式来确保页的完整性),但是中部的内容根据页的类型不同而发生变化。我们主要关注数据页和索引页,这种类型的页包括七个部分:

  • File Header:文件头,共38B,记录了页的地址、页号、上一页和下一页指针、页的类型信息、页的校验和checksum(校验和在写入磁盘前计算得到,当从磁盘中读取时,重新计算校验和并与数据页中存储的对比,如果发现不同,则会导致MySQL crash)、日志序列位置(LSN,Log Sequence Number,表示日志文件的长度,一个不断递增的unsigned long类型整数)等。
  • Page Header:数据页头,用来记录数据页的状态信息,包括Free Space的地址、本页中的记录的数量、标记为删除的记录等,共56B。
  • System records:Infimum + Supremum Records。InnoDB每页中有两个虚拟的行记录,用来限定记录的边界。Infimum记录是比该页中任何主键值都要小的记录,Supremum记录是比该页中任何主键值都要大的记录。这两个记录在页创建时被建立,并且在任何情况下不会被删除,并且由于这两条记录不是我们自己定义的记录,所以它们并不存放在页的User Records部分。所以如果数据是顺序存储的,那么查询数据是否在某一页中就无需遍历页中的所有数据,只需判断这两个记录就行了。
  • User Records:用户记录,以单链表的形式存储,如下图:

InnoDB磁盘结构详解

单链表

  • Free Space:空闲空间,用于存放新记录。在一开始生成页的时候,并没有User Records这个部分,每当插入一条记录,就会从Free Space部分中申请一个记录大小的空间到User Records部分,当Free Space用完时,这个页也就使用完了。
  • Page Directory:数据目录(弥补单向链表查询性能差的缺点),InnoDB会把页中的记录划分为若干个组,每个组的最后一个记录的地址偏移量作为一个槽,存放在Page Directory中,便于二分查找定位数据。对于分组中的记录数是有规定的:Infimum记录所在的分组只能有 1 条记录,Supremum记录所在的分组中的记录条数只能在1~8条之间,中间的其它分组中记录数只能在是4~8条之间。所以如果数据是顺序存储的,那么查询数据在某一页的位置就无需遍历页中的所有数据,只通过二分法就可以快速定位到对应的槽,然后再遍历该槽对应分组中的记录就能知道了。

相关阅读