在MySQL当中对数据的读入和写入的功能是在存储引擎上进行执行的,而MySQL的存储引擎则是含有多个存储引擎--innodb,myisam以及memory等存储引擎,在mysql中默认的存储引擎则是innodb引擎,同时这个引擎也是大多数的mysql都会使用的
InnoDB的页简介
innodb是一个表数据存储到磁盘的存储引擎,即使我们关闭重启服务器,数据还是依然存在的。在innodb中真正读取数据是在内存中读取的,而数据的修改也是在内存中修改后再刷新到磁盘当中去。那么我们想要读取数据的时候肯定不会是一条一条的读取这样会太慢了,那么在innodb当中则是通过一页来进行读取数据的,页的大小为16kb。
innodb当中的页大小参数设置则是通过innodb_page_size来进行设置的表明了页的大小,默认是16kb。需要注意的是只有mysql在初始化数据目录的时候该设置才会生效后期再次修改的时候则不会有作用。
InnoDB的行格式
我们平常都是以记录为单位向表中插入数据的,这些记录在磁盘上的存放位置也被称为行格式或者记录格式。设计InnoDB存储引擎的大叔到现在为止设计了4种不同类型的行格式,分别是COMPACT,REDUNDANT,DYNAMIC和COMPRESSED。
我们可以在创造表的时候指定行格式
CREATE TABLE 表名(列的信息) ROW_FORMAT = 行格式名称;
ALTER TABLE 表名 ROW_FORMAT = 行格式名称;
COMPACT
目前最主要默认也是使用最多的行格式则是COMPACT格式,下面我们来讲述一下COMPACT格式的组成。
那么在COMPACT则是由两个部分组成分别是额外数据和真实数据
额外数据
首先我们说一下额外信息主要包含三个部分:变长字段长度列表,null值列表,记录头信息
变长字段长度列表:我们知道在行记录中每个字段很有可能出现变长类型的字段也就是varchar类型,那么这个变长字段长度列表则是记录这些变长字段所占用的存储空间是多少。而变长字段则是存储的真实数据,并且在变长字段长度列表当中每个字段的长度顺序是按照逆序存储的
因此变长字段占用的空间分为两个部分:存储的真实数据,该数据占用的字节数
null值列表:我们知道在一些字段的某些列则会存储null值,那么这个null值列表字段则是按照位来存储该列数据是否为null的(把一条数据的null值统一管理起来,存储到null值列表中去)
二进制的值为1时候则代表这个值为null,二进制的值为0的时候则代表这个值不为null。
记录头信息:这个字段则是主要记录当前数据行的一些信息情况,主要有下述信息。
字段名称 | 长度(位) | 描述 |
---|---|---|
unused |
1 | 未使用(保留位) |
delete_mask |
1 | 删除标记:0 = 未删除,1 = 已删除(逻辑删除,物理空间未释放) |
min_rec_mask |
1 | 最小记录标记(用于索引页,表示该记录是 B+ 树中某个层级的最小记录) |
n_owned |
4 | 记录所属的 “组” 大小(InnoDB 将相邻记录分组,每组由一个 “领导记录” 管理) |
heap_no |
13 | 记录在页内的堆(Heap)中的位置编号(非索引顺序,用于内存管理) |
record_type |
3 | 记录类型: 0 = 普通记录,1 = 目录项记录,2 = 最小记录,3 = 最大记录 |
next_record |
16 | 指向下一条记录的相对偏移量(形成页内记录链表,按主键或索引顺序排列) |
真实数据
在mysql表中真实数据则是含有三个隐藏列分别是row_id,trx_id,roll_pointer三个字段
row_id则是表自动生成的主键id,如果当前表没有设置主键id,并且还不具有不为空并且不可重复的列,那么在创建表的时候数据库会自动生成一个隐藏列将此列当作主键id
trx_id则表示事务id,因为mysql每次开启一个事务都会自动生成一个事务id,而这个trx_id则是当前数据最后执行的事务id
roll_pointer回滚指针,这个字段则是存放着一个指针,来指向修改后的数据