InnoDB的索引物理存储结构

Innodb 规定每一个表都必须存在一个索引,所以如果没有规定索引,InnoDB会使用首个非空唯一索引 , 默认使用 6字节的指针

Innode 存储视图结构: 表空间 → 段 → 区 → 页/块 → 行

  • 表空间: 默认存在一个共享表空间 , 里面存储多个段
  • 段:分为 数据段、索引段、回滚段
  • 区: 默认 1MB ,即由64个连续的页组成 , 可以使用参数 KEY_BLOCK_SIZE
  • 页: 默认 16KB, 可以使用参数 INNODB_PAGE_SIZE
  • 行: 一行最大的存储空间是 16KB/2 - 200 == 7992 字节 , 按照存储结构分为 compact 和 redundant

compact 行存储结构: 变长字段长度列表 → NULL标志位 → 记录头 → 列数据

  • 变长字段长度列表: 记录列长度 , 如果列长度 < 255 字节 , 即这个字段占用一个字节 ; 如果大于等于 255字节,占用2字节数据 ; 最大占2字节 ; varchar 最大占用是 65535 字节
  • NULL 标志位: 占用1字节 0/1
  • 记录头: 占用5字节来记录一些基础数据。如: 删除标志、索引排序记录、类型标志(000 普通行 , 001 B+树节点 等)、下一个数据页的位置
  • 列数据: 存在多个存储的列数据,除了基础的数据,还存在一些特殊意义的列数据,如事务ID列、回滚指针列、未定义主键时innodb自定义的 6字节的row id 列

mysql5之前使用 redundant 行存储结构,即没有 NULL 标志位了