• 第9章 【MySQL】InnoDB的表空间


    表空间 是一个抽象的概念,对于系统表空间来说,对应着文件系统中一个或多个实际文件;对于每个独立表空间来说,对应着文件系统中一个名为 表名.ibd 的实际文件。大家可以把表空间想象成被切分为许许多多个 页 的池子,当我们想为某个表插入一条记录的时候,就从池子中捞出一个对应的页来把数据写进去。

    9.1 温习

    9.1.1 页面类型

    InnoDB是以页为单位管理存储空间的,我们的聚簇索引(也就是完整的表数据)和其他的二级索引都是以 B+ 树的形式保存到表空间的,而 B+ 树的节点就是数据页。我们前边说过,这个数据页的类型名其实是: FIL_PAGE_INDEX ,除了这种存放索引数据的页面类型之外,InnoDB也为了不同的目的设计了若干种不同类型的页面,为了唤醒大家的记忆,我们再一次把各种常用的页面类型提出来:

    类型名称

    十六进制

    描述

    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

    索引页,也就是数据页

    页面类型前边都有个 FIL_PAGE 或者 FIL_PAGE_TYPE 的前缀,为简便起见我们后边唠叨页面类型的时候就把这些前缀省略掉了,比方说 FIL_PAGE_TYPE_ALLOCATED 类型称为 ALLOCATED 类型, FIL_PAGE_INDEX 类型称为INDEX 类型。

    9.1.2 页面通用部分

    数据页,也就是 INDEX 类型的页由7个部分组成,其中的两个部分是所有类型的页面都通用的。当然我不能寄希望于你把我说的话都记住,所以在这里重新强调一遍,任何类型的页面都有下边这种通用的结构:

    从上图中可以看出,任何类型的页都会包含这两个部分:

    File Header :记录页面的一些通用信息

    File Trailer :校验页是否完整,保证从内存到磁盘刷新时内容的一致性。

    对于 File Trailer 我们不再做过多强调,全部忘记了的话可以到将数据页的那一章回顾一下。我们这里再强调一遍 File Header 的各个组成部分:

    名称

    占用空间大小

    描述

    FIL_PAGE_SPACE_OR_CHKSUM

    4 字节

    页的校验和(checksum值)

    FIL_PAGE_OFFSET

    4 字节

    页号

    FIL_PAGE_PREV

    4 字节

    上一个页的页号

    FIL_PAGE_NEXT

    4 字节

    下一个页的页号

    FIL_PAGE_LSN

    8 字节

    页面被最后修改时对应的日志序列位置(英文名是:Log SequenceNumber)

    FIL_PAGE_TYPE

    2 字节

    该页的类型

    FIL_PAGE_FILE_FLUSH_LSN

    8 字节

    仅在系统表空间的一个页中定义,代表文件至少被刷新到了对应的LSN值

    FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID

    4 字节

    页属于哪个表空间

    表空间中的每一个页都对应着一个页号,也就是 FIL_PAGE_OFFSET ,这个页号由4个字节组成,也就是32个比特位,所以一个表空间最多可以拥有2³²个页,如果按照页的默认大小16KB来算,一个表空间最多支持64TB的数据。表空间的第一个页的页号为0,之后的页号分别是1,2,3...依此类推

    某些类型的页可以组成链表,链表中的页可以不按照物理顺序存储,而是根据 FIL_PAGE_PREV 和FIL_PAGE_NEXT 来存储上一个页和下一个页的页号。需要注意的是,这两个字段主要是为了 INDEX 类型的页,也就是我们之前一直说的数据页建立 B+ 树后,为每层节点建立双向链表用的,一般类型的页是不使用这两个字段的。

    每个页的类型由 FIL_PAGE_TYPE 表示,比如像数据页的该字段的值就是 0x45BF ,我们后边会介绍各种不同类型的页,不同类型的页在该字段上的值是不同的。

  • 相关阅读:
    JVM面试题:(四)四种引用方式强弱软虚
    你要的七夕文案,已为您整理好!
    vue中web端播放rtsp视频流(摄像头监控视频)(海康威视录像机)
    Java8 JSR310规范-时间日期API使用总结
    保护云数据安全的关键环节是什么?
    kotlin 之单例类详解
    阿里云对象存储OSS文件无法预览,Bucket设置了Referer
    十分钟带你入门Go语言(Golang)开发
    基于springboot供应链管理系统毕业设计源码121518
    CUDA相关知识科普
  • 原文地址:https://blog.csdn.net/qq_43714918/article/details/133134108