Innodb存储引擎在读取一条数据的时候,是将数据记录从磁盘中取出来,然后在内存中进行处理的,当我们写入一条数据时,是将内存中的数据进行修改,然后再刷新到磁盘上,简称"数据落盘"。用一张图来表示就是:
这里需要注意的是,磁盘和内存之间交互的基本单位,我们称之为"数据页",这个概念很重要,在innodb中,这个页的大小,一般为16KB。
在Innodb中,页的内容不仅仅只有数据,页的类型大体包含存放数据的页,存放表空间头部信息的页,存放插入缓冲的页,以及存放undo日志的页等等,有兴趣的话,可以私下将他们全部搞清楚。
现在我们说说这16KB的页都包含哪些部分,从大的方面说,一共包含如下几个部分:
其中:
File Header包含的是页的通用信息,包括checksum(校验和)值、表空间中的偏移量、当前页的相邻页地址等等,它包含了8个部分,一共占用了38个字节;
Page Header包含的是数据页的一些状态信息,由14个部分组成,一共占用56个字节,
Infimum和Supermum是最大记录和最小记录,它们是数据也中的虚拟的行记录,用来限定数据页中记录的边界,这两个值在页创建的时候被建立,并且在任何情况下不会删除。
Record存储的是实际的数据
Free Space是数据页中空余的空间
Page Dic是指页中某些记录的相对位置
File Tailer检查一个页是否完整,它包含一个checksum值,会和File Header中的checksum值进行比较,检测这个页的完整性。
蓝色标示的部分是数据实际存储的位置,其他部分都是对这个数据页的一些记录信息。当我们在一个表里面插入数据的时候,实际上会从Free Space中查看是否有空余空间,如果有,那么从Free Space中分配一定的空间用于插入数据,如果没有,那么就去申请新的数据页。
关于页这7个部分的详细内容,后面会详细分析,今天的目的就是要有这样一个概念,就是数据是通过16KB大小的数据页来在磁盘和内存之间进行交互的,当我们插入数据的时候,会先从free space中查看,如果有空间,则插入该页,如果没有空间,则申请新的数据页。