InnoDB页介绍一下?

  • InnoDB 是一个将表中的数据存储到磁盘上的存储引擎,当我们想从表中获取某些记录时,InnoDB 采取的方式是:将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KB。也就是在一般情况下,一次最少从磁盘中读取16KB的内容到内存中,一次最少把内存中的16KB 内容刷新到磁盘中。
  • InnoDB 为了不同的目的而设计了许多种不同类型的页 ,比如存放表空间头部信息的页,存放 Insert Buffer 信息的页,存放 INODE 信息的页,存放 undo 日志信息的页。存放我们表中记录的那种类型的被称为索引( INDEX )页。

InnoDB数据页的大小为什么是16KB?

  • 在操作系统的文件管理系统中进行一次IO读写,默认读取的大小为4kb(一页)
  • 又因为局部性原理,操作系统会将命中的页周围的三块页一同加载进Innodb的缓存池中,因此Innnodb数据页的大小为16kb。

数据页结构?

数据页代表的这块 16KB 大小的存储空间可以被划分为多个部分,不同部分有不同的功能,各个部分如图所示:

数据页中查找指定主键值的过程?

在一个数据页中查找指定主键值的记录的过程分为两步:

  1. 通过二分法确定该记录所在的槽,并找到该槽中主键值最小的那条记录。
  2. 通过记录的 next_record 属性遍历该槽所在的组中的各个记录。

数据页总结

  1. InnoDB为了不同的目的而设计了不同类型的页,我们把用于存放记录的页叫做 数据页
  2. 一个数据页可以被大致划分为7个部分,分别是
    -File Header ,表示页的一些通用信息,占固定的38字节。
    -Page Header ,表示数据页专有的一些信息,占固定的56个字节。
    -Infimum + Supremum ,两个虚拟的伪记录,分别表示页中的最小和最大记录,占固定的 26 个字节。
    -User Records :真实存储我们插入的记录的部分,大小不固定。
    -Free Space :页中尚未使用的部分,大小不确定。
    -Page Directory :页中的某些记录相对位置,也就是各个槽在页面中的地址偏移量,大小不固定,插入的记录越多,这个部分占用的空间越多。
    -File Trailer :用于检验页是否完整的部分,占用固定的8个字节。
  3. 每个记录的头信息中都有一个 next_record 属性,从而使页中的所有记录串联成一个单链表
  4. InnoDB 会为把页中的记录划分为若干个组,每个组的最后一个记录的地址偏移量作为一个槽 ,存放在Page Directory 中,所以在一个页中根据主键查找记录是非常快的,分为两步:
    • 通过二分法确定该记录所在的槽。
    • 通过记录的next_record属性遍历该槽所在的组中的各个记录。
  5. 每个数据页的 File Header 部分都有上一个和下一个页的编号,所以所有的数据页会组成一个双链表
  6. 为保证从内存中同步到磁盘的页的完整性,在页的首部和尾部都会存储页中数据的校验和和页面最后修改时
    对应的 LSN 值,如果首部和尾部的校验和和 LSN 值校验不成功的话,就说明同步过程出现了问题。