MySQL InnoDB 逻辑存储结构

kyle 2017-02-07 2657次浏览 0条评论 0 打赏作者 0 0

如果创建表时没有显示的定义主键,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存储引擎》

0

0 条评论

    没有找到数据。

发表评论

kyle
土豪

kyle

注册时间:2016-10-28
最后登录:6小时前
发布
带到手机上看