• InnoDB 逻辑存储结构


    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/80

    如果创建表时没有显示的定义主键,mysql会按如下方式创建主键:

    • 首先判断表中是否有非空的唯一索引,如果有,则该列为主键。
    • 如果不符合上述条件,存储引擎会自动创建一个6字节大小的指针。

    当表中有多个非空的唯一索引,会选择建表时第一个定义的非空唯一索引。注意根据的是定义索引的顺序,不是创建列的顺序。

    InnoDB逻辑存储结构

    • 表空间 tablespace(ibd文件)
    • 段 segment(一个索引2个段)
    • Extent(1MB)
    • Page(16KB)
    • Row
    • Field

    image

    表空间

    所有数据都放在表空间中。如果开启了innodb_file_per_table选项,则InnoDB会为每张表开辟一个表空间。但是需要注意的是表空间存放的只是数据、索引和插入缓冲bitmap页,其他数据比如undo信息,插入缓冲索引页,系统事务信息,二次写缓冲还是会放在原来的共享表空间内。

    如果rollback后,共享表空间不会自动收缩,但是会判断空间是否需要(比如undo空间),如果不需要的话,会将这些空间标记为可用空间,供下次undo使用。

    表空间由各个段组成,比如数据段,索引段,回滚段等。

    区由连续的页组成,在任何情况下区的大小都是1M。InnoDB存储引擎一次从磁盘申请大概4-5个区。在默认情况下,页的大小为16KB,即一个区中有大概64个连续的页。

    InnoDB磁盘管理的最小单位。

    • B树节点= 一个物理Page(16K)
    • 数据按16KB切片为Page 并编号
    • 编号可映射到物理文件偏移(16K * N)
    • B+树叶子节点前后形成双向链表

    image

    • 增删改查之后
      • 有效Node组成双向链表
      • 中间存在空洞
      • 全表扫描时IO可能不连续

    关于页的详细结构,参考:MySQL的InnoDB索引原理详解

    数据是按行进行存放的。

    行记录格式

    InnoDB 1.0.x之前:

    • Compact
    • Redundant 为了兼容之前的版本

    InnoDB 1.0.x之后

    • Compressed
    • Dynamic

    查看行格式的方法,注意row_format字段。

    mysql> show table status like 'z'G;
    *************************
               Name: z
             Engine: InnoDB
            Version: 10
         Row_format: Dynamic
               Rows: 2
     Avg_row_length: 8192
        Data_length: 16384
    Max_data_length: 0
       Index_length: 0
          Data_free: 0
     Auto_increment: NULL
        Create_time: 2016-10-
        Update_time: 2016-10-
         Check_time: NULL
          Collation: latin1_s
           Checksum: NULL
     Create_options:
            Comment:
    1 row in set (0.00 sec)
    

    这里不详述各个行格式的格式了,有兴趣的可以看参考资料中的第4章。

    行溢出

    InnoDB存储引擎可以将数据存储到数据页之外。例如大对象列类型通常会被存放行溢出数据。

    对于Compact和Redundant格式,存储形式如下:
    image

    先在数据页面保存前768字节的数据,之后保存偏移量,指向行溢出页,也就是Uncompressed BLOB Page。

    对于Compressed和Dynamic行格式,采用完全的行溢出方式:
    image

    数据页只存放20字节的指针,实际数据存放在off page中。

    参考资料:《MySQL技术内幕-InnoDB存储引擎》

  • 相关阅读:
    java代码split分割数字类
    P1330 封锁阳光大学
    1022 舞会2
    1626 爱在心中
    P2024 食物链(two)
    P1196 银河英雄传说
    P1892 团伙
    P1546 最短网络(最小生成树)
    烦人的幻灯片(拓扑)
    例4.15 奖金(拓扑排序)
  • 原文地址:https://www.cnblogs.com/zhangyachen/p/8035698.html
Copyright © 2020-2023  润新知