1. MySQL存储结构全景解析
作为数据库内核开发者,我经常需要深入理解MySQL的存储结构设计。今天我将从实战角度,带大家彻底搞懂MySQL的段、区、页、行这四级存储结构。这些概念不仅是面试高频考点,更是性能优化的理论基础。
先看一个直观的类比:如果把MySQL的表空间比作Excel文件,那么:
- 段就是不同的Sheet页签(数据Sheet、索引Sheet)
- 区就是Sheet中划定的若干列范围
- 页就是具体的某个单元格区域
- 行就是单元格里的具体数据
这种层级设计体现了MySQL"分而治之"的存储哲学。接下来我们逐层拆解。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 段(Segment):表空间的逻辑分区
2.1 段的本质与分类
段是InnoDB中最大的逻辑存储单位,每个表空间由多个段组成。不同类型的段存储不同性质的数据:
- 数据段:存储B+树的叶子节点,即实际的行记录
- 索引段:存储B+树的非叶子节点,即索引结构
- 回滚段:存储undo日志,用于事务回滚
以创建article表为例:
sql复制CREATE TABLE article (
id INT PRIMARY KEY,
title VARCHAR(255),
content TEXT,
author VARCHAR(100)
);
CREATE INDEX idx_author ON article(author);
此时会创建:
- 数据段:存储所有行记录
- 主键索引段:存储主键B+树的非叶节点
- 二级索引段:存储author索引的B+树
- 回滚段:存储该表相关的undo日志
2.2 段的物理实现细节
段在物理上并不连续,而是通过段头(Segment Header)管理区集合。例如:
code复制数据段 = {区1, 区3, 区5}
索引段 = {区2, 区4}
这种设计实现了逻辑连续而物理分散的存储,既保证检索效率,又提高空间利用率。
3. 区(Extent):空间分配的基本单位
3.1 区的设计原理
每个区是1MB的连续空间,包含64个16KB的页。这种设计主要解决两个问题:
- 减少磁盘寻道时间:机械磁盘顺序读取比随机读取快100倍
- **预分
