暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

深入解析 MySQL 数据存储结构及其工作原理

解压泡泡糖 2025-04-25
72

MySQL 的数据存储结构非常复杂,涉及到多个方面,包括数据的物理存储、索引的管理、表的类型以及存储引擎的机制。不同的存储引擎有不同的存储方式和优化策略,但最常用的存储引擎是 InnoDB。因此,本文主要讲解 MySQL 中 InnoDB 存储引擎的数据存储结构。

一、MySQL 存储引擎概述

MySQL 提供了多个存储引擎,常见的包括:

InnoDB:默认存储引擎,支持事务、行级锁、外键、MVCC 等功能。

MyISAM:传统的存储引擎,不支持事务,但具有较高的查询性能。

Memory:基于内存的存储引擎,数据存储在 RAM 中,适合临时数据存储。

这里我们重点介绍 InnoDB 的数据存储结构,因为它是 MySQL 中最常用的存储引擎。

二、InnoDB 的数据存储结构

InnoDB 的数据存储结构可以分为以下几个主要部分:

数据页(Data Pages)

表空间(Tablespace)

聚簇索引(Clustered Index)

二级索引(Secondary Index)

事务日志(Redo Logs)

1. 数据页(Data Pages)

InnoDB 中的数据存储是以 页(Page) 为单位的。每个页的大小通常为 16KB(可以配置为 4KB、8KB 或 16KB)。数据页是 InnoDB 存储系统的基本单位,所有的数据都存储在这些数据页中。

数据页的结构:每个数据页内部的结构比较复杂,包含多个不同的部分:

页头(Page Header):包括页的元数据,如页类型、页的标识符、页的状态等。

记录部分(Record Section):存储实际的数据记录,每条记录有一个 主键值 和数据字段。

空闲空间部分:用于存储新的数据记录或扩展空间。

每个表的行数据都存储在 数据页 中,数据页内的数据记录是根据 主键的顺序 排序的。InnoDB 使用数据页来进行高效的存储和访问。

2. 表空间(Tablespace)

表空间是 InnoDB 中用于存储数据、索引、日志等内容的存储区域。在 InnoDB 中,表空间有两种类型:

系统表空间(System Tablespace):存储数据、索引、UNDO 日志、元数据等。默认情况下,所有 InnoDB 表的数据都存储在系统表空间中。

独立表空间(File-per-table Tablespace):每个表的数据存储在独立的 .ibd 文件中,而不是系统表空间中。

表空间在文件系统中通常对应一个或多个物理文件。在文件-per-table 模式下,每个表的数据存储在独立的 .ibd 文件中,这种模式更利于表的备份和管理。

3. 聚簇索引(Clustered Index)

InnoDB 的 聚簇索引(Clustered Index) 是表的默认索引,表数据本身是按照 主键 顺序存储的。换句话说,聚簇索引并不仅仅是索引,它同时也是数据的存储结构。

叶子节点:聚簇索引的叶子节点是实际存储的数据行,每一行数据都存储在叶子节点中。

数据的顺序存储:InnoDB 中,数据表的记录按照 主键顺序 存储,主键的值决定了数据行在磁盘上的存储顺序。这意味着,如果你定义了一个主键,那么该主键的值将决定数据的物理存储顺序。

没有主键的表:如果表没有主键,InnoDB 会自动创建一个隐藏的 聚簇索引,并使用一个自动生成的唯一 ID(通常是 64 位整数)作为主键。

聚簇索引的最大特点是:数据行和索引是紧密结合的,数据行存储在索引的叶子节点上,因此主键索引查询非常高效。聚簇索引的深度较浅,读取性能更优。

4. 二级索引(Secondary Index)

InnoDB 还支持 二级索引(Secondary Index),即除主键索引外的其他索引。二级索引的工作原理是:

二级索引的 叶子节点 并不存储数据行本身,而是存储 主键值(即聚簇索引的值)。当二级索引查询到主键值后,再通过主键值查找聚簇索引来获取数据行。

查询过程:

通过二级索引找到相关的主键值。

使用主键值在聚簇索引中查找对应的数据行。

这种结构也被称为 “回表查询”,因为二级索引并不直接包含数据行,而是通过主键值来回到聚簇索引中获取完整的数据。

5. 事务日志(Redo Logs)

InnoDB 使用 事务日志(Redo Log)来记录所有事务修改的数据内容,确保事务的 持久性(Durability)和 崩溃恢复。

事务日志的作用:当事务修改了数据后,首先会将修改操作记录到 redo log 中,然后再修改数据页。即使数据库发生崩溃,也可以通过 redo log 恢复未写入磁盘的数据。

日志文件:InnoDB 使用的日志文件通常有两个(ib_logfile0 和 ib_logfile1),它们存储着所有事务的提交记录和数据修改操作。每个日志文件的大小在创建数据库时可以配置。

三、数据存储的流程

插入数据:当新数据插入时,InnoDB 会在数据页中找到一个空闲的空间来存储数据。如果数据页已满,它会分裂并分配新的数据页。

更新数据:当对已有数据进行更新时,如果更新的字段属于主键列,那么 InnoDB 会在聚簇索引中修改对应的数据页。如果更新的字段属于非主键索引,InnoDB 会首先修改二级索引中的值,然后通过主键查询回聚簇索引,修改数据行。

删除数据:当数据被删除时,InnoDB 会将其标记为删除,并将数据页标记为回收,等到执行 purge 操作时,才会真正从磁盘中移除这些记录。

四、总结

MySQL 的数据存储结构是高度优化的,特别是在 InnoDB 存储引擎中,数据存储采用了页(Page)作为最小存储单位,通过 聚簇索引 来存储数据,确保了查询的高效性。同时,InnoDB 通过 事务日志、二级索引 和 回滚段 等机制确保了数据的 持久性、一致性 和 恢复性。

通过这些机制,InnoDB 能够在高并发的环境中提供高效的读写性能,保证数据的完整性和一致性。

文章转载自解压泡泡糖,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论