深入InnoDB引擎存储结构
🧯

深入InnoDB引擎存储结构

InnoDB引擎架构
InnoDB引擎架构
InnoDB是一种兼顾高可靠性和高性能的通用存储引擎。InnoDB是默认的MySQL存储引擎。

内存结构

Buffer Pool

Buffer Pool

Change Buffer

change buffer
 

Log Buffer

日志缓冲区是存储要写入磁盘日志文件的一块数据内存区域,大小由变量innodb_log_buffer_size 控制,默认大小为16MB(5.6版本是8MB):
SHOW VARIABLES LIKE 'innodb_log_buffer_size';-- global级别,无session级别
DML操作会缓存在Change Buffer区域,而写redo log之前会先写入Log Buffer,所以Log Buffer又可以称之为redo Log Buffer

自适应哈希索引

Adaptive Hash Index,自适应哈希索引。InnoDB引擎会监控对索引页的查询,如果发现建立哈希索引可以带来性能上的提升,就会建立哈希索引,这种称之为自适应哈希索引,InnoDB引擎不支持手动创建哈希索引

磁盘结构

页 page , 分区 extent, 段segment

MySQL一次IO的最小单位是页(page),也可以理解为一次原子操作都是以page为单位的,默认大小16k ,每次加载磁盘的数据到内存里的时候,是至少加载一页数据进去。
磁盘和内存之间的数据交换通过数据页来执行,包括内存里更新后的脏数据,刷回磁盘的时候,也是至少一个数据页刷回去。
一个数据页拆分成了很多个部分,大体上来说包含了文件头、数据页头、最小记录和最大记录、多个数据行、空闲空间、数据页目录、文件尾部
notion image
其中文件头占据了38个字节,数据页头占据了56个字节,最大记录和最小记录占据了26个字节,数据行区域的大小是不固定的,空闲区域的大小也是不固定的,数据页目录的大小也是不固定的,然后文件尾部占据8个字节。
 
segmentextent是InnoDB内部用于分配管理页的逻辑结构,用于分配与回收页,对于写入数据的性能至关重要。
extent区是由连续的页(Page)组成的空间,在任何情况下每个区大小都为1MB,为了保证页的连续性,InnoDB存储引擎每次从磁盘一次申请4-5个区。默认情况下,InnoDB存储引擎的页大小为16KB,即一个区中有64个连续的页。 (1MB/16KB=64)
InnoDB1.0.x版本开始引入压缩页,每个页的大小可以通过参数KEY_BLOCK_SIZE设置为2K、4K、8K,因此每个区对应的页尾512、256、128.
InnpDB1.2.x版本新增了参数innodb_page_size,通过该参数可以将默认页的大小设置为4K、8K,但是页中的数据不是压缩的。
 

行数据存储

行数据存储

索引的存储结构

详见索引

表空间 Tablespace

Tablespace

两次写 double write buffer

double write

redo log

详见日志系统redo log

undo log

详见日志系统undo log