1、数据库的存储结构: 页
1.1 磁盘与内存交互的基本单位:页
1.2 页结构概述
- 页a,页b,页c … 页n 这些页可以不在物理结构上相连,只要通过双向链表相关联即可
- 每个数据页中的记录会按照主键值从小到大的顺序组成一个单项链表
- 每个数据页都会为存储在它里面的记录生成一个页目录,通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽
然后再遍历该槽对应分组中的记录即可快速找到指定的记录
2、 页的内部结构
2.1 File Header(38字节 文件头部) + File Trailer(8字节 文件尾部)
2.1.1 File Header文件头
作用: 描述页的各种通用信息(比如页的编号、其上一页、下一页是谁等)
-
FIL_PAGE_OFFSET(4字节)
每个页都有一个单独的页号,就像跟你的身份证号码一样,InnoDB通过页号可以唯一确定一个页 -
FIL_PAGE_TYPE(2字节)
代表当前页的类型
-
FILE_PAGE_PREV(4字节)和 FIL_PAGE_NEXT(4字节)
InnoDB都是以页为单位存放数据的,如果数据分散到多个不连续的页中存储的话需要把这些页关联起来,FIL_PAGE_PREV和FIL_PAGE_NEXT就分别代表本页的上一个和下一个页的页号(也就是双向链表)
-
FIL_PAGE_SPACE_OR_CHKSUM (4字节)
代表当前页面的校验和(checksum)
什么是校验和?
就是对于一个很长的字节串来说,我们会通过某种算法来计算一个比较短的值来代表这个很长的字符串,这个比较短的值就称为校验和
在比较两个很长的字节串之前,先比较这两个长字节串的校验和,如果校验和都不一样,那么两个长字节串肯定是不同的,所以直接省去了直接 比较两个比较长的字节串的时间损耗
文件头部和文件尾部都有属性:FIL_PAGE_SPACE_OR_CHKSUM
作用:
InnoDB存储引擎以页为单位把数据加载到内存中处理,如果该页中的数据在内存中被修改了,那么在修改后额某个时间需要把数据同步到磁盘中。但是在同步了一般的时候断电了,造成了改页的传输的不完整
- FIL_PAGE_LSN(8字节)
Log Sequence Number : 页面最后修改时对应的日志序列位置
2.1.1 File Trailer文件尾
2.2 Free Space(空闲空间)+ User Record(用户记录)+ Infimum Supermum(最小最大记录)
2.3 Page Directory(页目录) + Page Header(页面头部)
2.3.1 Page Directory(页目录)
1、页目录中分组的个数如何确定?
2、页目录下如何快速查找记录?
Page Header(页面头部)
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 表名
3.2 COMPACT 行格式
3.2.1 变长字段长度列表
3.2.2 Null值列表
3.2.3 记录头信息
3.2.4 记录真实数据
3.2.5 记录真实数据
3.3 Dynamic和Compressed行格式
3.3.1 行溢出
我们可以知道一个页的大小一般是16KB,也就是16384字节,而一个VARCHAR(M)类型的列就最多可以存储65533个字节,这样就可能出现一个页存放不了一条记录,这种现象称为行溢出。
3.3.2 Dynamic和Compressed行格式
3.4 Redundant行格式
4、区、段和碎片区
4.1 为什么需要区?
4.2 为什么要有段
4.3 为什么要碎片区
4.4 区的分类
5、表空间
5.1 独立表空间
查看 InnoDB的表空间类型
show variables like 'innodb_file_per_table';
on表示开启独立表空间