美文网首页
MySQL InnoDB 存储结构

MySQL InnoDB 存储结构

作者: xiewen | 来源:发表于2016-07-19 17:18 被阅读703次

持续更新

逻辑存储结构

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内核

相关文章

网友评论

      本文标题:MySQL InnoDB 存储结构

      本文链接:https://www.haomeiwen.com/subject/rbnmjttx.html