IT袋

当前位置:主页 > 经验教程 > 硬件教程 >

InnoDB磁盘结构详解

InnoDB磁盘结构详解 深入探究InnoDB的磁盘结构(3)

时间:2023-09-23 23:35:19 来源:IT袋 作者:苏晓敏
导读:InnoDB磁盘结构详解,File Trailer:文件尾,共8B,包括页的校验和checksum(依赖于引擎选用的校验算法,不一定与文件头的checksum相同)、日志序列位置(LSN),与File Header中的相

InnoDB磁盘结构详解

  • File Trailer:文件尾,共8B,包括页的校验和checksum(依赖于引擎选用的校验算法,不一定与文件头的checksum相同)、日志序列位置(LSN),与File Header中的相同。默认情况下,InnoDB每次从磁盘读取一个页就会检测该页的完整性,即File Trailer中的内容需和File Header保持一致。
  • 数据行即一行一行的数据。MySQL中单行数据最大能存储64KB=65535B,故表中字段长度加起来如果超过该值就会拒绝创建表。以utf8mb4字符集下varchar(M)为例,该字符集下一个字符最多需要4B表示,如果M大于16383,那么总字节数就会超过4*16383=65532B,所以M的最大值就是16383个字符。

    虽然单行数据最大值远大于单页(16KB),但MySQL为了在单页中至少存储2行数据(每行8KB),引入了行溢出机制,即只要一行记录的总和超过8KB,就会溢出,比如varchar(9000) 或者 varchar(3000) + varchar(3000) + varchar(3000),当实际长度大于8k的时候,会对最大字段使用uncompress BLOB page单独存储(即一个字段独享一个或多个页),而在Barracuda文件格式下字段本身只会用20B存储溢出行的地址和占用的字节数。

    InnoDB的文件格式包括旧格式Antelope和新格式Barracuda(DMS使用该格式),两者主要的不同在于对存储数据时所占用的空间差异,每种文件格式有自己支持的行格式,行格式就是指数据行的存储方式,包括是否紧凑存储(占用磁盘空间)、是否可变长度存储、大索引前缀支持、压缩支持。差异如下:

    行格式紧凑的存储特性增强的可变长度列存储大索引键前缀支持压缩支持支持的表空间类型所需文件格式
    REDUNDANT(冗余)system, file-per-table, generalAntelope or Barracuda
    COMPACT(紧凑)system, file-per-table, generalAntelope or Barracuda
    DYNAMIC(动态)system, file-per-table, generalBarracuda
    COMPRESSED(压缩)file-per-table, generalBarracuda

    通过下列指令可以查询到数据库的文件格式和行格式配置:

    show variables like "InnoDB_file_format";
    show variables like "InnoDB_default_row_format";

    REDUNDANT和其他几种类型的区别在就是在于首部的内容区别。REDUNDANT的存储格式为首部是一个字段长度偏移列表(每个字段占用的字节长度及其相应的位移),其他类型的存储格式为首部是一个非NULL的变长字段长度列表,这种方式存储数据会更加紧凑(页中存放的行数越多,性能就越高),数据布局如下图:

    相关阅读