【mysql体系结构】InnoDB索引页结构

页是InnoDB管理存储空间的基本单元,一个页的大小一般是16KB。

mysql索引每一页的大小 mysql索引页结构_java

名称

中⽂名

占⽤空间⼤⼩

简单描述

File Header

⽂件头部

38字节

⻚的⼀些通⽤信息

Page Header

⻚⾯头部

56字节

数据⻚专有的⼀些信息

Infimum + Supremum

最⼩记录和最⼤记录

26字节

两个虚拟的⾏记录

User Records

⽤户记录

不确定

实际存储的⾏记录内容

Free Space

空闲空间

不确定

⻚中尚未使⽤的空间

Page Directory

⻚⾯⽬录

不确定

⻚中的某些记录的相对位置

File Trailer

⽂件尾部

8字节

校验⻚是否完整

File Header

File Header针对各种类型 的⻚都通⽤,也就是说不同类型的⻚都会以File Header作为第⼀个组成部分。这个部分占⽤固定的38个字节。是由下边这些内容组成的:

名称

占⽤空间⼤⼩

描述

FIL_PAGE_SPACE_OR_CHKSUM

4字节

⻚的校验和(checksum值)

FIL_PAGE_OFFSET

4字节

⻚号

FIL_PAGE_PREV

4字节

上⼀个⻚的⻚号

FIL_PAGE_NEXT

4字节

下⼀个⻚的⻚号

FIL_PAGE_LSN

8字节

⻚⾯被最后修改时对应的⽇志序列位置(英⽂名 是:Log Sequence Number)

FIL_PAGE_TYPE

2字节

该⻚的类型

FIL_PAGE_FILE_FLUSH_LSN

8字节

仅在系统表空间的⼀个⻚中定义,代表⽂件⾄少 被刷新到了对应的LSN值

FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID

4字节

⻚属于哪个表空间

  • FIL_PAGE_SPACE_OR_CHKSUM

这个代表当前⻚⾯的校验和(checksum)。就是对于⼀个很⻓很⻓的字节串来说,我们会通过某种算法来计算⼀个⽐较短的值来代表这个很 ⻓的字节串,这个⽐较短的值就称为校验和。这样在⽐较两个很⻓的字节串之前先⽐较这两个⻓字节串的校验和,如果校验和都不⼀样两个⻓字节串肯定是不 同的,所以省去了直接⽐较两个⽐较⻓的字节串的时间损耗。

  • FIL_PAGE_OFFSET

每⼀个⻚都有⼀个单独的⻚号,InnoDB通过⻚号来可以唯⼀定位⼀个⻚。

  • FIL_PAGE_TYPE

代表页的类型与值的对应关系:

类型名称

⼗六进制

描述

FIL_PAGE_TYPE_ALLOCATED

0x0000

最新分配,还没使⽤

FIL_PAGE_UNDO_LOG

0x0002

Undo⽇志⻚

FIL_PAGE_INODE

0x0003

段信息节点

FIL_PAGE_IBUF_FREE_LIST

0x0004

Insert Buffer空闲列表

FIL_PAGE_IBUF_BITMAP

0x0005

Insert Buffer位图

FIL_PAGE_TYPE_SYS

0x0006

系统⻚

FIL_PAGE_TYPE_TRX_SYS

0x0007

事务系统数据

FIL_PAGE_TYPE_FSP_HDR

0x0008

表空间头部信息

FIL_PAGE_TYPE_XDES

0x0009

扩展描述⻚

FIL_PAGE_TYPE_BLOB

0x000A

BLOB⻚

FIL_PAGE_INDEX

0x45BF

索引⻚,也就是我们所说的数据⻚

Page Header(页面头部)

Page Header的部分,它是⻚结构的第⼆部分,这个部分占⽤固定的56个字节,专⻔存储各种状态信息。

名称

占⽤空间⼤⼩

描述

PAGE_N_DIR_SLOTS

2字节

在⻚⽬录中的槽数量

PAGE_HEAP_TOP

2字节

还未使⽤的空间最⼩地址,也就是说从该地址之 后就是Free Space

PAGE_N_HEAP

2字节

本⻚中的记录的数量(包括最⼩和最⼤记录以及标记为删除的记录)

PAGE_FREE

2字节

第⼀个已经标记为删除的记录地址(各个已删除 的记录通过next_record也会组成⼀个单链表, 这个单链表中的记录可以被重新利⽤)

PAGE_GARBAGE

2字节

已删除记录占⽤的字节数

PAGE_LAST_INSERT

2字节

最后插⼊记录的位置

PAGE_DIRECTION

2字节

记录插⼊的⽅向

PAGE_N_DIRECTION

2字节

⼀个⽅向连续插⼊的记录数量

PAGE_N_RECS

2字节

该⻚中记录的数量(不包括最⼩和最⼤记录以及 被标记为删除的记录)

PAGE_MAX_TRX_ID

8字节

修改当前⻚的最⼤事务ID,该值仅在⼆级索引中定义

PAGE_LEVEL

2字节

当前⻚在B+树中所处的层级

PAGE_INDEX_ID

8字节

索引ID,表示当前⻚属于哪个索引

PAGE_BTR_SEG_LEAF

10字节

B+树叶⼦段的头部信息,仅在B+树的Root⻚定义

PAGE_BTR_SEG_TOP

10字节

B+树⾮叶⼦段的头部信息,仅在B+树的Root⻚定义

  • PAGE_DIRECTION

假如新插⼊的⼀条记录的主键值⽐上⼀条记录的主键值⼤,我们说这条记录的插⼊⽅向是右边,反之则是左边。⽤来表示最后⼀条记录插⼊⽅向的状态就是PAGE_DIRECTION。

  • PAGE_N_DIRECTION

假设连续⼏次插⼊新记录的⽅向都是⼀致的,InnoDB会把沿着同⼀个⽅向插⼊记录的条数记下来,这个条数就⽤PAGE_N_DIRECTION这个状态表示。当然,如果最后⼀条记录的插⼊⽅向改变了的话,这个状态的值会被清零重新统计。

Page Directory页目录

对于最⼩记录所在的分组只能有1条记录,最⼤记录所在的分组拥有的记录条数只能在1-8条

之间,剩下的分组中记录的条数范围只能在是4-8条之间。

在⼀个数据⻚中查找指定主键值的记录的过程分为两步:

1、通过⼆分法确定该记录所在的槽,并找到该槽中主键值最⼩的那条记录。

2、通过记录的next_record属性遍历该槽所在的组中的各个记录。

File Trailer

File Trailer部分,这个部分由8个字节组成,可以分成2个⼩部分:

  • 前4个字节代表⻚的校验和

这个部分是和File Header中的校验和相对应的。每当⼀个⻚⾯在内存中修改了,在同步之前就要把它的校验和算出来,因为File Header在⻚⾯的前边,所 以校验和会被⾸先同步到磁盘,当完全写完时,校验和也会被写到⻚的尾部,如果完全同步成功,则⻚的⾸部和尾部的校验和应该是⼀致的。如果写了⼀半断电了,那么在File Header中的校验和就代表着已经修改过的⻚,⽽在File Trialer中的校验和代表着原先的⻚,⼆者不同则意味着同步中间出了错。

  • 后4个字节代表⻚⾯被最后修改时对应的⽇志序列位置(LSN)