0

mysql之Tablespace结构

2024.09.11 | cuithink | 93次围观

从Innodb存储引擎的逻辑结构看,所有的数据都被逻辑地放在一个空间内,称之为表空间,表空间又由 段(segment),区(extent),页(page)组成。页在一些文档中有时候也称为块(block) ,如下图所示:

  • 段(segment)

区(extent)

页(page)

    • 表空间由段组成,常见的段有数据段、索引段、回滚段等。

    • InnoDB存储引擎表是索引组织的,因此数据即索引,索引即数据。数据段即为B+树的叶子结点,索引段即为B+树的非索引结点

    • 在InnoDB存储引擎中对段的管理都是由引擎自身所完成,DBA不能也没必要对其进行控制。

    • 区是由连续页组成的空间,在任何情况下每个区的大小都为1MB

    • 为了保证区中页的连续性,InnoDB存储引擎一次从磁盘申请4~5个区

    • 默认情况下,InnoDB存储引擎页的大小为16KB,一个区中一共64个连续的区。

    • 页是InnoDB磁盘管理的最小单位

    • 在InnoDB存储引擎中,默认每个页的大小为16KB

    • 从InnoDB1.2.x版本开始,可以通过参数innodbpagesize将页的大小设置为4K,8K,16K。

    • InnoDB存储引擎中,常见的页类型有:数据页,undo页,系统页,事务数据页,插入缓冲位图页,插入缓冲空闲列表页等。

页结构

innodb数据页由以下7部分组成,如图所示:

这里少了张图

其中File Header、Page Header、File Trailer的大小是固定的,分别为38,56,8字节,这些空间用来标记该页的一些信息,如Checksum,数据页所在B+树索引的层数等。User Records、Free Space、Page Directory这些部分为实际的行记录存储空间,因此大小是动态的。

下边我们用表格的方式来大致描述一下这7个部分:

记录在页中的存储流程图

每当我们插入一条记录,都会从Free Space部分,也就是尚未使用的存储空间中申请一个记录大小的空间划分到User Records部分,当Free Space部分的空间全部被User Records部分替代掉之后,也就意味着这个页使用完了,如果还有新的记录插入的话,就需要去申请新的页了,这个过程的图示如下:

不同的Innodb页构成的数据结构图

一张表中可以有成千上万条记录,一个页只有16KB,所以可能需要好多页来存放数据。不同页其实构成了一条双向链表,File Header是InnoDB页的第一部分,它的FILPAGEPREV和FILPAGENEXT就分别代表本页的上一个和下一个页的页号,即链表的上一个以及下一个节点指针。


粤ICP备16076548号
发表评论