InnoDB 存储结构与索引页结构

InnoDB 存储引擎是 MySQL 的一个重要存储引擎,采用了多种优化技术来提高性能。以下是 InnoDB 记录存储结构和索引页结构的详细解析:

1. InnoDB 记录存储结构

InnoDB 的数据存储在数据页中,每个数据页大小默认为 16KB。数据页中包含多个记录。InnoDB 的记录结构主要由以下几个部分组成:

1. 页(Page)

InnoDB 使用页(Page)作为基本的存储单位。每个页的大小通常为 16KB。页中可以存储多条记录,页的结构如下:

  • File Header:页的文件头部信息,包括页类型、页号等元数据。
  • Page Header:页头部信息,包括页中记录的数量、记录列表的指针等。
  • Infimum 和 Supremum 记录:每个页中都有两条伪记录,分别是最小和最大记录,用于记录的边界。
  • User Records:实际的用户记录数据。
  • Free Space:可用的空闲空间,用于插入新记录。
  • Page Directory:页目录,用于加速记录的查找。
  • File Trailer:页的文件尾部信息,包括校验和等数据完整性信息。
2. 行(Row)

每个页中存储多条行记录,行记录的结构如下:

  • Record Header:记录头部信息,包括记录的大小、标志位、下一条记录指针等。
  • Primary Key:主键值,用于唯一标识每条记录。
  • Transaction ID:事务 ID,标识最后一次修改该记录的事务。
  • Rollback Pointer:回滚指针,指向回滚日志,用于支持事务的回滚操作。
  • Hidden Columns:隐藏列,包括版本号和删除标志,用于 MVCC(多版本并发控制)。
  • User Columns:实际的用户列数据。

2. InnoDB 索引页结构

索引页用于加速数据的查找,InnoDB 支持多种索引类型,最常用的是聚簇索引和二级索引。

聚簇索引(Clustered Index)

在 InnoDB 中,聚簇索引的叶子节点存储了实际的数据记录。一个表只能有一个聚簇索引,通常是主键索引。

  • 聚簇索引的页结构
    • 页头:包含页的信息,如页号、页类型等。
    • 索引节点:存储索引键值和数据记录的物理位置(数据页号和行号)。
    • 数据记录:叶子节点存储数据记录的实际数据。
二级索引(Secondary Index)

二级索引是基于非主键列建立的索引,叶子节点存储的是索引列的值和指向数据记录的指针。

  • 二级索引的页结构
    • 页头:包含页的信息,如页号、页类型等。
    • 索引节点:存储索引键值和指向数据记录的指针(数据页号和行号)。
    • 数据记录指针:指向实际数据记录的位置。

3. 索引页的详细结构

聚簇索引页结构

聚簇索引的页结构包括以下部分:

  • 页头(Page Header)

    • 页类型标识(聚簇索引页)。
    • 页号、页大小、校验和等信息。
  • 索引节点(Index Node)

    • 每个节点包含索引键值和指向数据页的指针。
    • 节点之间通过链表连接,按索引键值排序。
  • 数据记录(Data Record)

    • 叶子节点存储实际数据记录的完整数据。
    • 每个数据记录包含数据头和数据体。
二级索引页结构

二级索引的页结构包括以下部分:

  • 页头(Page Header)

    • 页类型标识(二级索引页)。
    • 页号、页大小、校验和等信息。
  • 索引节点(Index Node)

    • 每个节点包含索引列的值和指向数据记录的指针(数据页号和行号)。
    • 节点之间通过链表连接,按索引键值排序。
  • 数据记录指针(Data Record Pointer)

    • 指向数据页的指针,指向实际数据记录的位置。

4. 数据页与索引页示意图

以下是数据页和索引页的简化示意图:

数据页示意图
+---------------------+
| Page Header          |     [页头信息]
+---------------------+
| Record Space         |     [数据记录区域]
|    +-----------------+
|    | Record Header    |     [记录头信息]
|    +-----------------+
|    | Record Data      |     [记录数据内容]
|    +-----------------+
|    | ...              |
|    +-----------------+
| Free Space           |     [空闲空间]
+---------------------+
聚簇索引页示意图
+---------------------+
| Page Header          |     [页头信息]
+---------------------+
| Index Node           |     [索引节点]
|    +-----------------+
|    | Key Value        |     [索引键值]
|    | Data Pointer      |     [数据记录指针]
|    +-----------------+
|    | ...              |
|    +-----------------+
| Data Records         |     [数据记录]
|    +-----------------+
|    | Record Header    |     [记录头信息]
|    +-----------------+
|    | Record Data      |     [记录数据内容]
|    +-----------------+
|    | ...              |
+---------------------+
二级索引页示意图
+---------------------+
| Page Header          |     [页头信息]
+---------------------+
| Index Node           |     [索引节点]
|    +-----------------+
|    | Key Value        |     [索引键值]
|    | Data Pointer      |     [数据记录指针]
|    +-----------------+
|    | ...              |
+---------------------+
| Data Record Pointers |     [数据记录指针]
|    +-----------------+
|    | Data Page Pointer |     [数据页指针]
|    | Row Pointer       |     [行号]
|    +-----------------+
|    | ...              |
+---------------------+

5. 总结

InnoDB 的存储结构和索引页结构设计使得 MySQL 数据库在性能和可靠性上都有很好的表现。通过合理配置和优化这些结构,可以显著提高数据库的查询性能和数据操作效率。理解这些底层原理,对于数据库的维护和优化具有重要意义。

相关推荐

  1. InnoDB 存储结构索引结构

    2024-07-16 17:32:08       22 阅读
  2. MySQL5.7 InnoDB 磁盘结构索引Index

    2024-07-16 17:32:08       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 17:32:08       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 17:32:08       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 17:32:08       62 阅读
  4. Python语言-面向对象

    2024-07-16 17:32:08       72 阅读

热门阅读

  1. C++ 入门13:异常处理

    2024-07-16 17:32:08       18 阅读
  2. Nim 游戏

    2024-07-16 17:32:08       25 阅读
  3. 用Racket做一个拼图游戏——31 创建主程序

    2024-07-16 17:32:08       24 阅读
  4. Python使用蓝牙抓包

    2024-07-16 17:32:08       19 阅读
  5. ## 基础知识

    2024-07-16 17:32:08       22 阅读
  6. C# 4.0 等待线程结束

    2024-07-16 17:32:08       26 阅读
  7. leetcode hot 100 刷题记录(medium)

    2024-07-16 17:32:08       24 阅读
  8. git 常用命令: 将代码暂存入缓存区,从栈区取出

    2024-07-16 17:32:08       18 阅读
  9. axios js请求后端的使用直接使用

    2024-07-16 17:32:08       16 阅读
  10. py每日spider案例之影视搜索篇

    2024-07-16 17:32:08       22 阅读
  11. Triple协议 和dubbo协议

    2024-07-16 17:32:08       23 阅读