自学内容网 自学内容网

InnoDB 中的索引页与数据行的关联详解

目录

  1. InnoDB 数据库基础概念
    • 1.1 页(Page)的概念
    • 1.2 行(Row)的概念
  2. InnoDB 索引页的结构
    • 2.1 B+ 树索引结构
    • 2.2 页结构详解
  3. InnoDB 数据行的存储结构
    • 3.1 数据行存储格式
    • 3.2 数据行的物理存储位置
  4. 索引页与数据行的关联
    • 4.1 聚簇索引与数据页的关联
    • 4.2 辅助索引与数据页的关联
  5. InnoDB 中的页管理与优化
  6. 总结

InnoDB 数据库基础概念

1.1 页(Page)的概念

在 InnoDB 存储引擎中,**页(Page)**是最小的物理存储单位。InnoDB 默认的页大小为 16KB。数据的读写操作是以页为单位进行的,即使只需要读取一行数据,InnoDB 也会将包含该行数据的整个页加载到内存中。

InnoDB 页的类型非常多,包括数据页、索引页、UNDO 页、事务日志页等,其中我们重点关注数据页(Data Page)索引页(Index Page)

1.2 行(Row)的概念

**行(Row)**是数据库表中最小的数据存储单位。每一行记录表示表中的一条数据。在 InnoDB 中,每一行数据都会存储在数据页中,并且数据行与索引紧密相关。

数据行的存储是物理上连续的,但逻辑上却可以通过索引进行高效的查询和管理。通过理解行和页的存储关系,我们可以更好地优化查询和数据存储性能。

InnoDB 索引页的结构

2.1 B+ 树索引结构

在 InnoDB 中,所有的索引都基于 B+ 树(B+ Tree) 结构来实现。B+ 树是一种平衡树,具有高效的查询、插入和删除性能。B+ 树的非叶子节点只存储索引键值,而叶子节点则存储实际的数据页或主键指针。

B+ 树结构的主要特点:

  • 非叶子节点仅存储索引字段,不存储完整数据。
  • 叶子节点之间通过双向链表连接,以便进行范围查询。
  • B+ 树的深度通常较小,因此通过索引查找数据时,访问的磁盘页数也较少。

InnoDB 将索引页组织成 B+ 树,每个节点对应一个页。树的根节点位于最高层,而叶子节点包含实际的索引或数据。

2.2 页结构详解

每个 InnoDB 页包括多个部分,主要包含以下关键结构:

  • Page Header:页头部信息,记录页的类型、页号等元数据。
  • Infimum 和 Supremum Records:页中最小和最大的虚拟记录,用于页的分隔。
  • User Records:实际的数据记录,或索引键值。
  • Page Directory:记录数据行在页中的偏移量,用于快速查找数据。
  • Page Trailer:用于校验页是否完整。

在索引页中,页中的 User Records 包含的是索引值和与之对应的数据行指针,而在数据页中,User Records 则是实际的数据行。

InnoDB 数据行的存储结构

3.1 数据行存储格式

InnoDB 中,数据行存储在数据页(Data Page)中。数据行的存储格式依赖于表的定义方式,常见的格式有以下几种:

  • Compact 格式:这是默认的存储格式,存储效率较高。每一行记录除了实际数据外,还包含一些额外的信息(如记录头信息、事务 ID、回滚指针等)。
  • Redundant 格式:旧版本的存储格式,相对占用更多的存储空间。

每一行数据的存储包括:

  • 记录头信息:记录长度、记录类型等。
  • 事务信息:如事务 ID、回滚指针,用于保证事务一致性。
  • 实际列数据:行中每一列的实际存储数据。

3.2 数据行的物理存储位置

InnoDB 将每个表的数据存储在单独的表空间文件中(如果开启 innodb_file_per_table),数据行被存储在表空间中的数据页(Data Page)中。每个数据页可以容纳多行数据,页与页之间通过链表连接。

索引页与数据行的关联

4.1 聚簇索引与数据页的关联

在 InnoDB 中,聚簇索引(Clustered Index) 是表中最重要的索引。对于每张表,InnoDB 都会使用主键创建聚簇索引。如果没有定义主键,InnoDB 会自动生成一个隐藏的主键来作为聚簇索引。

聚簇索引的叶子节点不仅存储索引键值,还存储实际的行数据。这意味着通过聚簇索引查询数据时,查询到叶子节点即可获取完整的数据行,无需再进行其他数据页的访问。

示例

假设有一个包含 id 作为主键的表:

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    age INT
) ENGINE=InnoDB;

在该表中,InnoDB 会为 id 创建聚簇索引。在 B+ 树的叶子节点,除了存储 id 值外,还存储 nameage 列的数据。因此,通过主键查询数据时,无需再从其他地方获取数据。

4.2 辅助索引与数据页的关联

辅助索引(Secondary Index) 是指除了聚簇索引外的其他索引。在 InnoDB 中,辅助索引的叶子节点只存储索引键值和对应的主键值,不存储实际的数据行。因此,当使用辅助索引查询时,首先通过索引键值找到对应的主键值,然后再通过主键去查找聚簇索引获取完整的数据行。

这种查找过程被称为回表(Index Backtracking)。当辅助索引命中时,InnoDB 会进行两次索引查找:一次是通过辅助索引查找主键值,另一次是通过主键值查找聚簇索引中的实际数据。

示例

假设我们为 employees 表中的 name 字段创建一个辅助索引:

CREATE INDEX idx_name ON employees(name);

当我们执行如下查询时:

SELECT * FROM employees WHERE name = 'John';

InnoDB 首先通过 idx_name 索引查找到 John 对应的 id 值,然后再通过聚簇索引查找到 id 对应的完整数据行。

InnoDB 中的页管理与优化

5.1 页分裂与合并

当插入新的数据时,如果当前页已满,InnoDB 会将该页分裂为两个页,这一过程称为页分裂(Page Split)。页分裂后,InnoDB 会调整 B+ 树结构以保持平衡。

相反,当删除数据时,InnoDB 可能会发生页合并(Page Merge),将数据量较少的页合并成一个页,从而减少存储空间的浪费。

5.2 页缓存与缓冲池

为了提高查询性能,InnoDB 使用了**缓冲池(Buffer Pool)**来缓存页。当查询数据时,InnoDB 会优先从缓冲池中查找数据,而

不是直接访问磁盘。这大大减少了磁盘 I/O 操作,提升了查询性能。

总结

InnoDB 中的索引页和数据行之间有着紧密的联系,聚簇索引和辅助索引的实现决定了数据的查找方式。理解索引页和数据行的关联,有助于我们更好地优化数据库的查询性能和存储效率。通过合理设计索引和优化 InnoDB 的页管理策略,可以有效提升数据库的整体性能。


原文地址:https://blog.csdn.net/fudaihb/article/details/142649533

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!