第9章 【MySQL】InnoDB的表空间

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 第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

扩展描述页

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 ,我们后边会介绍各种不同类型的页,不同类型的页在该字段上的值是不同的。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
28天前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
22天前
|
存储 关系型数据库 MySQL
关系型数据库mysql的InnoDB
【6月更文挑战第17天】
20 3
|
20天前
|
关系型数据库 MySQL 调度
深入理解MySQL InnoDB线程模型
深入理解MySQL InnoDB线程模型
|
20天前
|
存储 关系型数据库 MySQL
mysql的InnoDB引擎实现ACID特性的原理
mysql的InnoDB引擎实现ACID特性的原理
|
2月前
|
存储 监控 关系型数据库
MySQL 参数innodb_read_io_threads
`innodb_read_io_threads` 是 MySQL 数据库中 InnoDB 存储引擎的一个配置参数,它用于指定后台线程池中用于处理读取 I/O 请求的线程数量。InnoDB 存储引擎负责管理数据库的物理存储和检索,是 MySQL 最常用的存储引擎之一。 ### 参数说明 - **名称**: `innodb_read_io_threads` - **默认值**: 4 - **范围**: 1 到 64 - **动态修改**: 不能动态修改(需要重启服务器) - **适用版本**: MySQL 5.6 及以上版本 ### 作用 `innodb_read_io_threads`
199 1
|
1月前
|
存储 SQL 关系型数据库
【MySQL技术内幕】6.3-InnoDB中的锁
【MySQL技术内幕】6.3-InnoDB中的锁
155 57
|
1月前
|
存储 算法 关系型数据库
【MySQL技术内幕】5.7- InnoDB存储引擎中的哈希算法
【MySQL技术内幕】5.7- InnoDB存储引擎中的哈希算法
20 1
|
1月前
|
存储 算法 关系型数据库
【MySQL技术内幕】4.4-InnoDB数据页结构
【MySQL技术内幕】4.4-InnoDB数据页结构
25 1
|
1月前
|
存储 算法 关系型数据库
【MySQL技术内幕】2.3-InnoDB体系架构
【MySQL技术内幕】2.3-InnoDB体系架构
23 1
|
1月前
|
存储 关系型数据库 MySQL
MySQL数据库——InnoDB引擎-逻辑存储结构(表空间、段、区、页、行)
MySQL数据库——InnoDB引擎-逻辑存储结构(表空间、段、区、页、行)
42 7