数据库存储

SHOW VARIABLES LIKE 'datadir'; // 查看存储位置,一般 /var/lib/mysql/

没创建一个数据库,会在/var/lib/mysql下面创建以数据库名的文件夹,里面一般有dp.opt, table_name.frm, table_name.ibd

  • dp.opt:数据库字符和校验规则
  • .frm:表结构的元数据,每建立一张表,都会有一个文件
  • .ibd:表数据实际存储位置,称之为表空间,表空间由段、区、页、行的层级结构组成

InnoDB的逻辑存储结构如下:

img

行存储

行格式

InnoDB有四种行格式:Redundant, Compact, DynamicCompressed

Redundant:有点老了,已经不再用了,而且不紧凑

Compact:紧凑的行格式

Dynamic, Compressed:都是基于compact的改进,默认是Dynamimc

Compact入手就很容易懂了,如下图所示

img

  • 记录头信息:保存着删除标志、下一条记录的位置(记录头和记录真实数据之间的位置)、记录类型等等
  • NULL值列表:从右往左依次代表从左往右的列是否为NULL,用比特位表示,不足就填充到一个字节。
  • 变长字段长度列表:从右往左依次代表从左往右的可变长列的长度,如果变长字段最大长度小于等于255,就用一个字节表示,否则就用两个字节表示。
  • row_id,trx_id,roll_ptr:都是在事务需要用到的
  • 列值:如果太长,则需要使用溢出页来存储额外部分,会使用20个字节来存储溢出页位置。

PS右->左左->右是为了提高缓存命中率

页存储

图片

B+树存储

B+树以页为一个节点的,存储如下:

图片