美文网首页
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