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 数据库在性能和可靠性上都有很好的表现。通过合理配置和优化这些结构,可以显著提高数据库的查询性能和数据操作效率。理解这些底层原理,对于数据库的维护和优化具有重要意义。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值