> 文章列表 > 高级篇七、InnoDB数据存储结构

高级篇七、InnoDB数据存储结构

高级篇七、InnoDB数据存储结构

1、数据库的存储结构: 页

高级篇七、InnoDB数据存储结构

1.1 磁盘与内存交互的基本单位:页

高级篇七、InnoDB数据存储结构
高级篇七、InnoDB数据存储结构

高级篇七、InnoDB数据存储结构

1.2 页结构概述

  • 页a,页b,页c … 页n 这些页可以不在物理结构上相连,只要通过双向链表相关联即可
  • 每个数据页中的记录会按照主键值从小到大的顺序组成一个单项链表
  • 每个数据页都会为存储在它里面的记录生成一个页目录,通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽
    然后再遍历该槽对应分组中的记录即可快速找到指定的记录

高级篇七、InnoDB数据存储结构
高级篇七、InnoDB数据存储结构

2、 页的内部结构

高级篇七、InnoDB数据存储结构
高级篇七、InnoDB数据存储结构
高级篇七、InnoDB数据存储结构

2.1 File Header(38字节 文件头部) + File Trailer(8字节 文件尾部)

2.1.1 File Header文件头

作用: 描述页的各种通用信息(比如页的编号、其上一页、下一页是谁等)
高级篇七、InnoDB数据存储结构

  • FIL_PAGE_OFFSET(4字节)
    每个页都有一个单独的页号,就像跟你的身份证号码一样,InnoDB通过页号可以唯一确定一个页

  • FIL_PAGE_TYPE(2字节)
    代表当前页的类型
    高级篇七、InnoDB数据存储结构

  • FILE_PAGE_PREV(4字节)和 FIL_PAGE_NEXT(4字节)
    InnoDB都是以页为单位存放数据的,如果数据分散到多个不连续的页中存储的话需要把这些页关联起来,FIL_PAGE_PREV和FIL_PAGE_NEXT就分别代表本页的上一个和下一个页的页号(也就是双向链表)
    高级篇七、InnoDB数据存储结构

  • FIL_PAGE_SPACE_OR_CHKSUM (4字节)
    代表当前页面的校验和(checksum)

什么是校验和?
就是对于一个很长的字节串来说,我们会通过某种算法来计算一个比较短的值来代表这个很长的字符串,这个比较短的值就称为校验和
在比较两个很长的字节串之前,先比较这两个长字节串的校验和,如果校验和都不一样,那么两个长字节串肯定是不同的,所以直接省去了直接 比较两个比较长的字节串的时间损耗

文件头部和文件尾部都有属性:FIL_PAGE_SPACE_OR_CHKSUM
作用:
InnoDB存储引擎以页为单位把数据加载到内存中处理,如果该页中的数据在内存中被修改了,那么在修改后额某个时间需要把数据同步到磁盘中。但是在同步了一般的时候断电了,造成了改页的传输的不完整

高级篇七、InnoDB数据存储结构

  • FIL_PAGE_LSN(8字节)
    Log Sequence Number : 页面最后修改时对应的日志序列位置

2.1.1 File Trailer文件尾

高级篇七、InnoDB数据存储结构

2.2 Free Space(空闲空间)+ User Record(用户记录)+ Infimum Supermum(最小最大记录)

高级篇七、InnoDB数据存储结构
高级篇七、InnoDB数据存储结构

高级篇七、InnoDB数据存储结构
高级篇七、InnoDB数据存储结构

2.3 Page Directory(页目录) + Page Header(页面头部)

2.3.1 Page Directory(页目录)

1、页目录中分组的个数如何确定?

2、页目录下如何快速查找记录?

Page Header(页面头部)

高级篇七、InnoDB数据存储结构

3、InnoDB行格式

3.1 指定行格式语法

在创建或修改表的语句中指定行格式:

CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称
ALTER TABLE 表名 ROW_FORMAT=行格式名称举例:
mysql> CREATE TABLE record_test_table (->     col1 VARCHAR(8),->     col2 VARCHAR(8) NOT NULL,->     col3 CHAR(8),->     col4 VARCHAR(8)-> ) CHARSET=ascii ROW_FORMAT=COMPACT;

查看MySQL8默认的行格式

select @@innodb_default_row_format;
或者
show table status like 表名

高级篇七、InnoDB数据存储结构高级篇七、InnoDB数据存储结构

3.2 COMPACT 行格式

3.2.1 变长字段长度列表

高级篇七、InnoDB数据存储结构

3.2.2 Null值列表

高级篇七、InnoDB数据存储结构

3.2.3 记录头信息

高级篇七、InnoDB数据存储结构

3.2.4 记录真实数据

高级篇七、InnoDB数据存储结构

3.2.5 记录真实数据

高级篇七、InnoDB数据存储结构
高级篇七、InnoDB数据存储结构
高级篇七、InnoDB数据存储结构

3.3 Dynamic和Compressed行格式

3.3.1 行溢出

我们可以知道一个页的大小一般是16KB,也就是16384字节,而一个VARCHAR(M)类型的列就最多可以存储65533个字节,这样就可能出现一个页存放不了一条记录,这种现象称为行溢出

3.3.2 Dynamic和Compressed行格式

3.4 Redundant行格式

4、区、段和碎片区

4.1 为什么需要区?

高级篇七、InnoDB数据存储结构

4.2 为什么要有段

高级篇七、InnoDB数据存储结构

4.3 为什么要碎片区

高级篇七、InnoDB数据存储结构

4.4 区的分类

高级篇七、InnoDB数据存储结构

5、表空间

高级篇七、InnoDB数据存储结构

5.1 独立表空间

高级篇七、InnoDB数据存储结构
查看 InnoDB的表空间类型

show variables like 'innodb_file_per_table';

on表示开启独立表空间
高级篇七、InnoDB数据存储结构

5.2 系统表空间