innoDB存储引擎逻辑存储单元

本文详细介绍了InnoDB存储引擎的逻辑存储单元结构,包括表空间、段、区、页及行等内容。每个非压缩页默认大小为16K,一个区包含64个页。页内分为7个部分:文件头、页头、最小及最大虚记录、用户记录、自由堆、页目录和文件尾。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    innoDB存储引擎的逻辑存储单元由表空间、段、区、页(块page)、行等构成,所有的记录存放在数据库页(Page)中,也可以称之为数据块 一般情况下 非压缩的默认大小为16K。一个区有64个page组成(16*64=1024K 即1M),。



16K 64个页
8K 128个页
4K 256个页

一个页(page)包括7个部分:

文件头(Fil Header)
页头(Page Header)
最小以及最大虚记录(indimum+Supermum Recods)
用户记录(User Records)
自由堆(Free Space)
页目录(Page Directory)
文件尾(Fil Trailer)


<think>我们正在讨论InnoDB存储引擎逻辑结构。根据引用内容,InnoDB逻辑存储结构主要涉及表空间(Tablespace)、段(Segment)、区(Extent)、页(Page)以及行(Row)这几个层次。下面我将逐一详细介绍。 1. **表空间(Tablespace)**: - 表空间是InnoDB存储引擎逻辑结构的最高层,所有的数据都存储在表空间中。 - 表空间可以分为: - **系统表空间(System Tablespace)**:存储InnoDB的数据字典(在MySQL 8.0之前)、双写缓冲区(Doublewrite Buffer)、更改缓冲区(Change Buffer)、undo日志(在MySQL 8.0之前)以及一些表和索引数据(如果表创建在系统表空间中)。系统表空间由一个或多个数据文件组成,由参数`innodb_data_file_path`指定。 - **独立表空间(File-Per-Table Tablespace)**:每个表都有一个独立的表空间文件(.ibd文件),存储该表的索引和数据。这是MySQL 5.6之后的默认行为(由参数`innodb_file_per_table`控制)。 - **通用表空间(General Tablespace)**:多个表可以共享一个通用表空间,通过`CREATE TABLESPACE`创建。 - **Undo表空间(Undo Tablespace)**:在MySQL 8.0中,undo日志从系统表空间中分离出来,存储在单独的undo表空间中,用于存储undo日志。 - **临时表空间(Temporary Tablespace)**:存储临时表的数据。 2. **段(Segment)**: - 表空间由多个段组成,段是分配空间的基本单位。常见的段有数据段、索引段、回滚段等。 - 数据段存储表中的数据(即聚集索引的叶子节点),索引段存储非叶子节点(索引节点),回滚段存储undo日志。 3. **区(Extent)**: - 每个段由多个区组成,区是连续分配的页。在InnoDB中,一个区固定为1MB(在页大小为16KB时,一个区包含64个连续页)。 - 区可以避免频繁的磁盘分配操作,提高性能。 4. **页(Page)**: - 页是InnoDB磁盘管理的最小单位,默认大小为16KB(可以通过参数`innodb_page_size`设置,但一旦创建数据库就不能更改)。 - 页的类型有很多,例如:数据页(B-tree节点)、undo页、系统页、事务数据页、插入缓冲位图页、插入缓冲空闲列表页等。 - 数据页(B-tree节点)存储行记录和索引信息。InnoDB采用B+树索引结构,数据页就是B+树的叶子节点,索引页是非叶子节点。 5. **行(Row)**: - 页中存储的是行记录。InnoDB存储引擎是面向行的(row-oriented),即数据按行存储。 - 每行记录都包含事务ID(Transaction ID)、回滚指针(Roll Pointer)以及行数据(包括主键和其他列)。 - InnoDB采用索引组织表(Index Organized Table, IOT)的方式存储数据,即表中的数据按照主键顺序存储。如果没有显式定义主键,InnoDB会选择一个唯一非空索引作为主键,如果也没有,则会自动生成一个6字节的rowID作为主键。 总结一下InnoDB逻辑存储结构:表空间由段组成,段由区组成,区由页组成,页中存储行记录。这种层次结构有助于高效地管理磁盘空间和进行数据读写。 另外,根据引用[1]和[3],InnoDB的表是索引组织表,即数据按照主键顺序存储。这种结构使得基于主键的查询非常高效。 [^1]:【MySQL】Innodb存储引擎逻辑存储结构与底层实现解析 [^2]:【MySQL数据库】InnoDB存储引擎逻辑存储结构、内存架构、磁盘架构 [^3]:MySQL中InnoDB存储引擎详细介绍 §§相关问题§§ 1. InnoDB存储引擎中,表空间有哪些类型?各自的作用是什么? 2. 为什么InnoDB采用索引组织表(IOT)的方式存储数据?有什么优势? 3. InnoDB的页(Page)默认大小是多少?可以修改吗?修改时需要注意什么? 4. 在InnoDB中,如果没有显式定义主键,会发生什么? 5. InnoDB逻辑存储结构与物理存储结构有什么联系和区别?</think>### InnoDB存储引擎逻辑架构详解 InnoDB存储引擎采用分层的逻辑存储结构,从大到小依次为:**表空间 → 段 → 区 → 页 → 行**。以下是各层级的详细说明: --- #### **1. 表空间(Tablespace)** 表空间是InnoDB逻辑结构的最高层,分为两类: - **系统表空间(System Tablespace)** - 存储内容: - 数据字典(MySQL 8.0前) - 双写缓冲区(Doublewrite Buffer) - 更改缓冲区(Change Buffer) - Undo日志(MySQL 8.0前) - 未指定独立表空间的表数据与索引 - 配置文件:`innodb_data_file_path` 定义数据文件路径和大小[^2][^3]。 - **独立表空间(File-Per-Table Tablespace)** - 每个表单独存储为 `.ibd` 文件(默认启用)。 - 包含表数据、索引及关联的Undo日志(MySQL 8.0+)。 - **通用表空间(General Tablespace)** - 多个表共享一个表空间文件,通过 `CREATE TABLESPACE` 创建。 - **Undo表空间(Undo Tablespace)** - MySQL 8.0+ 将Undo日志从系统表空间分离,独立存储。 --- #### **2. 段(Segment)** 段是表空间的子结构,管理特定类型的数据分配: - **数据段**:存储B+树叶子节点(实际行数据)。 - **索引段**:存储B+树非叶子节点(索引指针)。 - **回滚段**:存储Undo日志,用于事务回滚。 > 每个索引对应两个段(叶子段+非叶子段),由InnoDB自动管理[^1]。 --- #### **3. 区(Extent)** 区是连续页的集合,用于优化空间分配: - 固定大小:**1MB**(默认页大小16KB时,1区=64页)。 - 作用:减少频繁分配小单元的开销,提升I/O效率。 --- #### **4. 页(Page)** 页是InnoDB磁盘管理的最小单元: - **默认大小**:16KB(可通过 `innodb_page_size` 配置,但需在初始化时设置)。 - 核心类型: - **数据页(B-tree Node)**:存储行记录与索引。 - **Undo页**:存储事务回滚日志。 - **系统页**:管理区、段等元数据。 - 页内结构: - 文件头(File Header):页编号、前后页指针(形成双向链表)。 - 行记录(Row Records):按主键顺序存储(索引组织表)。 - 页目录(Page Directory):槽位加速行记录查找。 --- #### **5. 行(Row)** 行是数据存储的基本单位: - **格式**:支持Compact、Redundant、Dynamic等行格式(默认Dynamic)。 - **组成**: - 事务ID(Transaction ID) - 回滚指针(Roll Pointer) - 列数据(含隐藏主键 `row_id`) - **主键规则**: - 显式定义主键 → 按主键顺序存储(索引组织表)。 - 未定义主键 → 自动生成6字节 `row_id` 作为主键[^1]。 --- ### 逻辑架构总结图 ```plaintext 表空间 (Tablespace) │ ├─ 段 (Segment) → 数据段 / 索引段 / 回滚段 │ │ │ └─ 区 (Extent) → 1MB (64个连续页) │ │ │ └─ 页 (Page) → 16KB (B+树节点) │ │ │ └─ 行 (Row) → 事务ID + 列值 ``` > 核心特性:**索引组织表(IOT)** > 所有数据按主键顺序存储在B+树中,非主键索引的叶子节点直接指向主键值[^1][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值