InnoDB 引擎底层深度解析:从行格式到 Buffer Pool 的内存架构

关键词:InnoDB, MySQL, 行格式, Buffer Pool, 双写机制, 页结构, 表空间, LRU, 数据库原理


前言

InnoDB 是 MySQL 中最重要、最常用的存储引擎,它的高性能和高可靠性背后隐藏着怎样的底层架构?

当你执行一条 INSERT 语句时,数据是如何存储到磁盘上的?

Buffer Pool 是如何管理内存中的数据页的?

双写机制又是怎样保证数据安全的?

本文将带你深入 InnoDB 的底层世界,从行格式页结构表空间Buffer Pool 的内存管理,全面解析 InnoDB 的存储引擎原理。掌握这些知识,你将能够更好地理解 MySQL 的性能表现,并做出更合理的优化决策。


目录

  1. InnoDB 行格式详解
  2. InnoDB 页结构剖析
  3. InnoDB 表空间结构
  4. Buffer Pool 内存管理
  5. 总结

一、InnoDB 行格式详解

1.1 为什么需要行格式

我们平时是以记录为单位向表中插入数据的,这些记录在磁盘上的存放方式就是行格式。InnoDB 存储引擎设计了 4 种不同类型的行格式:

行格式 版本 特点
COMPACT 5.0+ 紧凑格式,节省空间
Redundant 5.0 之前 冗余格式,已废弃
Dynamic 5.7+ 默认格式,优化大字段存储
Compressed 5.7+ 支持页面压缩

查看默认行格式:

SHOW VARIABLES LIKE 'innodb_default_row_format';
-- 默认值:dynamic

创建表时指定行格式:

CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称;

-- 示例
CREATE TABLE text(c1 VARCHAR(10)) ROW_FORMAT=COMPACT;

1.2 COMPACT 行格式结构

COMPACT 行格式示意图如下(从前往后):

+----------------+----------------+----------------+--------------+
| 变长字段长度列表 | NULL值列表     | 记录头信息     | 隐藏列信息   |
+----------------+----------------+----------------+--------------+
| 真实数据       |
+----------------+
变长字段长度列表

MySQL 支持变长数据类型(VARCHAR、VARBINARY、TEXT、BLOB 等),变长字段存储多少字节的数据是不固定的。因此需要存储这些数据占用的字节数。

规则

  • 如果最大字节数(M×W)超过 255 字节且真实存储字节数(L)超过 127 字节,使用 2 个字节
  • 否则使用 1 个字节
NULL 值列表

Compact 行格式把值为 NULL 的列统一管理,存储到 NULL 值列表:

  • 每个允许存储 NULL 的列对应一个二进制位
  • 值为 1:该列的值为 NULL
  • 值为 0:该列的值不为 NULL
记录头信息(5 字节)
字段 位数 说明
预留位1 1 未使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加倍巴巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值