关键词:InnoDB, MySQL, 行格式, Buffer Pool, 双写机制, 页结构, 表空间, LRU, 数据库原理
前言
InnoDB 是 MySQL 中最重要、最常用的存储引擎,它的高性能和高可靠性背后隐藏着怎样的底层架构?
当你执行一条 INSERT 语句时,数据是如何存储到磁盘上的?
Buffer Pool 是如何管理内存中的数据页的?
双写机制又是怎样保证数据安全的?
本文将带你深入 InnoDB 的底层世界,从行格式、页结构、表空间到 Buffer Pool 的内存管理,全面解析 InnoDB 的存储引擎原理。掌握这些知识,你将能够更好地理解 MySQL 的性能表现,并做出更合理的优化决策。
目录
一、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 | 未使用 |



被折叠的 条评论
为什么被折叠?



