InnoDB管理存储空间的基本单位介绍
InnoDB
管理存储空间的基本单位为页
,一个页的大小一般是16KB
,由于储存目的不同,因为有多种类型的页,这篇文章后面提到的页均为我们表中数据储存的地方即索引页
。索引页
就是我们口中的数据页
。
数据页的基本划分
基础概念解释
1.User Records
和Free Space
的基本划分,即真实存放数据位置的划分?
mysql中我们存储的记录会按照我们指定的
行格式
(储存方式,具体请看其他文章)存储到User Records
部分。但在一开始生成页的时候,并没有User Records
这个部分,而当我们每插入一条记录,就会从Free Space
部分,也就是尚未使用的存储空间中申请一个记录大小的空间划分到User Records
部分,当Free Space
部分的空间全部被User Records
部分替代掉之后,就意味着这个页使用完了,如果还有新的记录插入的话,就需要去申请新的页了。
2.Infimum + Supremum
最大最小虚拟记录?
Infimum
记录就是最小记录, 它的下一条记录就是本页中主键值最小的用户插入的记录,本页中主键值最大的用户记录的下一条记录就是Supremum
记录即最大记录。
3.每一条记录是怎么相互关联的?
记录头信息的
next_record
字段,它会记住下一条记录的相对位置,像个链表一样。
4.数据删除后数据页中是怎么变化的?储存空间变化呢?
同样在头信息中有个字段
delete_mask
会标记该记录是否删除。值为0的时候代表记录并没有被删除,为1的时候代表记录被删除掉了。删除只是字段变化,如果下一次有新纪录插入则旧纪录(删除数据)的空间会被重新利用。
5.数据记录这么多,怎么查找?字典书籍都是有目录的,那数据页呢?
答案是有的。上图中的
Page Directory
空间就是储存这个目录页的。InnoDB
会把页中的记录划分为若干个组,每个组的最后一个记录的地址偏移量作为一个槽,存放在Page Directory
中,所以在一个页中根据主键查找记录是非常快的。①通过二分法确定该记录所在的槽。②通过记录的next_record
属性遍历该槽所在的组中的各个记录。
6.数据页这么多,InnoDB是如果定位查找页的?
File Header
(文件头部)中有个字段,FIL_PAGE_OFFSET
,每一个页都有一个单独的页号,InnoDB通过页号来可以唯一定位一个页。
7.页中的记录是通过记录头信息的某个字段关联的,那么页和页是怎么关联的?
同样在
File Header
(文件头部)中有FIL_PAGE_PREV
和FIL_PAGE_NEXT
两个字段,分别代表本页的上一个和下一个页的页号。这样通过建立一个双向链表把众多的页串联起来,无需这些页在物理上真正连着。
需要注意的是,并不是所有类型的页都有上一个和下一个页的属性,目前讨论的数据页(也就是类型为FIL_PAGE_INDEX的页)是有这两个属性的,所以所有的数据页可以看作是一个双链表。
8.InnoDB
如何保证数据从内存同步到磁盘的完整性?
File Trailer
部分的校验和
,为保证从内存中同步到磁盘的页的完整性,在页的首部和尾部都会存储页中数据的校验和和页面最后修改时对应的LSN值,如果首部和尾部的校验和和LSN值校验不成功的话,就说明同步过程出现了问题。
评论区