持续更新
逻辑存储结构
InnoDB存储引擎的逻辑存储结构和Oracle几乎一样,从大到小分别为:表空间、段、区、页,它们的关系如下图所示:
表空间InnoDB有一个默认的表空间,如果启用了参数innodb_file_per_table,则针对每张可以单独放在表空间里。这里需要注意的是,即时启用了innodb_file_per_table,也并不是表中所有的数据都单独放在自己的表空间里,单独表空间只存放数据、索引和插入缓冲,其它如Undo、系统事务信息、二次写缓冲等还是存放在默认共享表空间里。
段表空间有若干各段组成,常见的有数据段、索引段、回滚段等。前面提到InnoDB中的表是索引组织表,因此数据段也称为leaf node segment,索引段也称为non-leaf node segment。
区每64个连续的页组成区,因此区大小正好为1M。
页页是InnoDB磁盘管理的最小单位,固定大小为16K,不可以更改(也许通过更改源码可以修改固定大小)。
行InnoDB表中数据按行存储。
记录结构
三个部分
Name | Size |
---|---|
Field Start Offsets | (F1) or (F2) 字节 |
Extra Bytes | 6 字节 |
Field Contents | 和实际数据的长度有关 |
F 表示字段的数量
字段指针(Origin 或 Zero Point)并非指向 Field Start Offsets,其实指向了第三部分 Field Contents 开始的位置。知道了字段指针,再做减法,就能得到前两个部分的位置
1. Field Start Offsets
是一组偏移量(每个字段结尾到 Field Contents 开始的偏移量)的列表,记录了字段的位置信息
此列表为反向排序,即第一个字段的偏移量放在列表末端
比如,有三个字段的长度分别为 1、2、4,则 Field Start Offsets 为 07,03,01
每个偏移量用一个字节或两个字节表示
当记录总长度小于 127 字节时,用一个字节表示
Extra Bytes 标识使用了一个字节还是两个字节
偏移量中的最高有效位通常表示 flag 标记位
一个字节的偏移量:
Size | 备注 |
---|---|
1 bit | 1 表示字段的值是 NULL |
7 bits | 实际的偏移量。范围 0 - 127 |
两个字节的偏移量:
Size | 备注 |
---|---|
1 bit | 1 表示字段的值是 NULL |
1 bit | 0,字段存储在同一页 1,字段存储在不同页(BLOB 类型的字段才会在不同页) |
14 bits | 实际的偏移量。范围 0 - 16383 |
2. Extra Bytes
固定长度 6 字节,即 48 位
Name | Size | Description | |
---|---|---|---|
info_bits: | () | 1 bit | 没用 |
() | 1 bit | 没用 | |
deleted_flag | 1 bit | 1 表示记录已删除 | |
min_rec_flag | 1 bit | 1 表示此记录是预定义的最小值记录 | |
n_owned | 4 bits | 此记录拥有的记录数(???) | |
heap_no | 13 bits | 记录在索引页堆中的序号(???) | |
n_fields | 10 bits | 字段数量, 1 to 1023 | |
1byte_offs_flag | 1 bit |
表示 Field Start Offsets 是一个字节还是两个字节 1 表示是一个字节 |
|
next 16 bits | 16 bits | 指向下一记录的指针 | |
TOTAL | 48 bits | - |
3. Field Contents
存储实际数据,按照表定义的顺序存储
页结构
七个部分
Fil Header | |
Page Header | |
Infimum + Supremum Records | |
User Records | |
Free Space | |
Page Directory | |
Fil Trailer |
参考资料
http://dev.mysql.com/doc/internals/en/innodb.html
杨万富、思考mysql内核