InnoDB 页(Page)结构:数据页、索引页、系统页的组成

好嘞,各位看官,今天咱们就来聊聊InnoDB的“小窝”——页(Page)结构。别看这玩意儿藏在数据库的底层,它可是InnoDB存储引擎的基石,就像盖房子用的砖头,没它,啥也建不起来!🧱

咱们今天就来扒一扒InnoDB的“小窝”里到底住着些啥,看看数据页、索引页、系统页,这些不同的“房间”都有啥特色。保证让大家听得津津有味,以后再跟数据库唠嗑,也能底气十足!😎

开场白:数据库的“安家置业”

各位,咱们先来想象一下,你要把一大堆数据都塞进数据库里,那它们住哪儿呢?总不能像无家可归的流浪汉一样到处乱窜吧?这就需要数据库提供一个“安家置业”的解决方案,也就是“页”的概念。

在InnoDB存储引擎里,页是磁盘管理的最小单元,默认大小是16KB。你可以把它想象成数据库这栋大楼里的一间间公寓,每一间公寓都能住一些数据,而且井然有序。🏠

正文:InnoDB “小窝”的内部结构大揭秘

InnoDB的页结构,就像一个精心设计的“小窝”,麻雀虽小,五脏俱全。它主要由以下几个部分组成:

组成部分 大小 (字节) 描述
File Header 38 页的头部信息,记录了页的类型、校验和等重要信息。
Page Header 56 记录了页的状态信息,比如页中记录的数量、页的空闲空间等。
Infimum + Supremum Records 26 两个虚拟的行记录,分别表示页中最小和最大的记录。它们就像哨兵一样,保证页中记录的有序性。
User Records 变长 实际存储的用户数据,也就是咱们要存进数据库里的信息。
Free Space 变长 页中剩余的空闲空间,用于存放新的记录。
Page Directory 变长 页目录,用于快速定位页中的记录。它就像一本书的目录一样,可以帮助你快速找到想要的内容。
File Trailer 8 文件尾部信息,包含了页的校验和等信息,用于保证页的完整性。

咱们来逐个“房间”看看:

  1. File Header(文件头部)

    这个是页的“身份证”,记录了页的类型、校验和等关键信息。就像每个公民都有身份证一样,每个页都有一个唯一的“身份证”来标识自己。里面包含以下信息:

    • FIL_PAGE_OFFSET (4字节):页号,在整个表空间中唯一标识该页。就像楼房的房间号一样。
    • FIL_PAGE_PREV (4字节):前一页的页号,用于形成双向链表。
    • FIL_PAGE_NEXT (4字节):后一页的页号,同样用于形成双向链表。
    • FIL_PAGE_TYPE (2字节):页的类型,咱们一会儿会详细介绍。
    • FIL_PAGE_FILE_FLUSH_LSN (8字节):页最后被刷新到磁盘时的LSN(Log Sequence Number),用于崩溃恢复。
    • FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID (4字节):归档日志编号或表空间ID。
    • FIL_PAGE_SPACE_OR_CHKSUM (4字节):校验和,用于验证页的完整性。
  2. Page Header(页头部)

    这个是页的“状态栏”,记录了页的状态信息,比如页中记录的数量、页的空闲空间等。就像手机的状态栏一样,可以让你随时了解页的状态。它包含以下信息:

    • PAGE_DIRECTION (2字节):记录插入方向,用于优化插入操作。
    • PAGE_N_RECS (2字节):页中记录的数量。
    • PAGE_HEAP_TOP (2字节):堆顶指针,指向页中未使用的空间。
    • PAGE_LAST_INSERT (2字节):最后插入记录的位置。
    • PAGE_MAX_TRX_ID (8字节):页中最大的事务ID。
    • PAGE_LEVEL (2字节):页的层级,用于索引页。
    • PAGE_INDEX_ID (8字节):索引ID,用于索引页。
  3. Infimum + Supremum Records(最小最大记录)

    这两个是虚拟的行记录,分别表示页中最小和最大的记录。它们就像“门神”一样,保证页中记录的有序性。有了它们,在查找记录的时候,可以先和这两个记录比较,快速判断记录是否在该页中。

  4. User Records(用户记录)

    这个是页的“卧室”,存放着实际的用户数据,也就是咱们要存进数据库里的信息。这些记录按照主键(Primary Key)或者唯一索引(Unique Index)的顺序排列。

  5. Free Space(空闲空间)

    这个是页的“储藏室”,存放着页中剩余的空闲空间,用于存放新的记录。当需要插入新的记录时,InnoDB会从这个空间中分配一部分来存放新的记录。

  6. Page Directory(页目录)

    这个是页的“索引”,用于快速定位页中的记录。它就像一本书的目录一样,可以帮助你快速找到想要的内容。InnoDB使用槽(Slot)来管理页目录,每个槽指向页中的一组记录。通过二分查找,可以快速定位到目标记录所在的槽,然后在这个槽中顺序查找。

  7. File Trailer(文件尾部)

    这个是页的“防伪标签”,包含了页的校验和等信息,用于保证页的完整性。就像商品的防伪标签一样,可以防止页被篡改。

InnoDB 页的“类型”:不同的“公寓”住着不同的人

InnoDB的页有很多种类型,不同的类型用于存储不同的数据。咱们来介绍几种常见的类型:

  1. 数据页(INDEX Page)

    这是最常见的页类型,用于存储实际的用户数据。就像普通住宅一样,存放着咱们的日常数据。数据页的FIL_PAGE_TYPE值为0x45BF

  2. 索引页(INDEX Page)

    用于存储索引数据,加快数据检索的速度。就像图书馆的索引卡片一样,可以帮助你快速找到想要的书籍。索引页的FIL_PAGE_TYPE值也是0x45BF,但是它的PAGE_LEVEL字段会记录索引的层级。

  3. 系统页(System Page)

    用于存储系统信息,比如表空间信息、undo日志信息等。就像大楼的管理处一样,存放着一些重要的管理信息。系统页包括以下几种类型:

    • FIL_PAGE_UNDO_LOG (0x0002):Undo日志页,用于存储undo日志。
    • FIL_PAGE_INODE (0x0003):Inode页,用于存储索引节点的元数据。
    • FIL_PAGE_IBUF (0x0004):Insert Buffer页,用于存储Insert Buffer的数据。
    • FIL_PAGE_SYS (0x0005):系统页,用于存储系统信息。
    • FIL_PAGE_TRX_SYS (0x0007):事务系统页,用于存储事务系统信息。
    • FIL_PAGE_FSP_HDR (0x0008):表空间头部页,用于存储表空间头部信息。
    • FIL_PAGE_TYPE_ALLOC (0x0009):分配页,用于存储表空间的分配信息。
    • FIL_PAGE_SDI (0x000A):序列化数据结构信息页,用于存储序列化数据结构信息。
  4. BLOB页 (Uncompressed BLOB Page & Compressed BLOB Page)

    用于存储大对象数据(BLOB),比如图片、视频等。就像专门的仓库一样,存放着一些体积较大的数据。

数据页(INDEX Page)的“秘密”:B+树的叶子节点

数据页在InnoDB中扮演着重要的角色,它是B+树的叶子节点,存储着实际的用户数据。B+树是一种平衡的多路查找树,它可以有效地加快数据检索的速度。

咱们来简单了解一下B+树的结构:

  • 根节点(Root Node):B+树的最高层节点,包含指向下一层节点的指针。
  • 中间节点(Internal Node):位于根节点和叶子节点之间,包含指向下一层节点的指针。
  • 叶子节点(Leaf Node):B+树的最底层节点,存储着实际的用户数据。

数据页就是B+树的叶子节点,它存储着实际的用户数据,并且按照主键或者唯一索引的顺序排列。通过B+树的索引,可以快速定位到目标数据所在的页,然后在这个页中顺序查找。

索引页(INDEX Page)的“使命”:B+树的非叶子节点

索引页是B+树的非叶子节点,它存储着索引数据,用于加快数据检索的速度。索引页不存储实际的用户数据,而是存储索引键和指向下一层节点的指针。

通过索引页,可以快速定位到目标数据所在的叶子节点(数据页),然后在这个叶子节点中顺序查找。

系统页(System Page)的“职责”:数据库的“后勤保障”

系统页用于存储系统信息,比如表空间信息、undo日志信息等。它们就像数据库的“后勤保障”一样,为数据库的正常运行提供支持。

结尾:InnoDB “小窝”的重要性

各位,咱们今天就聊到这里。通过今天的讲解,相信大家对InnoDB的页结构有了更深入的了解。

InnoDB的页结构是InnoDB存储引擎的基石,它决定了数据的存储方式和检索效率。理解InnoDB的页结构,可以帮助我们更好地理解InnoDB的工作原理,从而更好地优化数据库性能。

记住,数据库的“安家置业”可是大事,InnoDB的“小窝”更是关键!希望今天的分享对大家有所帮助。下次有机会,咱们再来聊聊InnoDB的其他“秘密”!👋

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注