首页 > 其他分享 >InnoDB 数据页

InnoDB 数据页

时间:2024-03-31 21:22:05浏览次数:15  
标签:记录 查找 InnoDB File 数据 Page

参考资料

https://relph1119.github.io/mysql-learning-notes/#/mysql/

我们知道InnoDB 管理存储空间的基本单位是页,一个页的大小默认是16KB 。 InnoDB 为了不同的目的而设计了许多种不同类型的页,如change buffer page、undo log page、index page。其中,Index Page就是用于存放数据的页。

数据页结构

一个 InnoDB 数据页的存储空间大致被划分成了 7 个部分

数据页字段信息

Infimum/Supremum

固定占用26个字节,每个数据页中都自动添加了两个记录,一个代表最小记录,一个代表最大记录。

User Records

用于存储记录数据的的区域,记录按照主键的顺序由小到大存储。每行记录中存储了下一行记录的地址,形成一个单向的链表。

Page Directory

我们知道记录在页中按照主键值由小到大的顺序串联成一个单链表,那么,怎么根据主键值查询页中的记录呢?比如说这样的查询语句:

SELECT * FROM page_demo WHERE c1 = 3;

最简单的方式是遍历页中的记录,从最小记录Infimum开始,沿着链表往下依次查找,直到找到符合条件的记录或者链表遍历完为止,时间复杂度是O(N)。这种查找方式随着页中记录数量的增加,查询时间也同步随之增加。

在实际情况中,一个数据页中保存的记录是很多的,通过遍历的方式,过于低效。Page Directory就是用来加速页内记录查找的,类似于一本书的目录,通过目录可以快速找到内容。

Page Directory的创建

  1. 将所有正常的记录(包括最大和最小记录,不包括标记为已删除的记录),按顺序划分组,每组最多包含八行记录。 其中最小记录为第一个分组,该分组只有一条记录。
  2. 每个组的最后一条记录(也就是组内最大的那条记录)的头信息中的 n_owned 属性表示该组内共有几条记录。
  3. 将每个组的最后一条记录的地址偏移量单独提取出来按顺序存储到Page Directory,也叫做页目录,页面目录中的这些地址偏移量被称为槽(Slot)。

有些类似于一个两层的跳表,先通过第一层的链表(相当于Slot)进行二分查找,确定记录所在的区间,然后在该区间进行遍历匹配。

例如现在一个数据页中page directory中有0,1,2,3,4五个槽位,对应的主键值分别是4,8,12,16,20。现在查找主键等于10的记录:

  1. 开始二分查找,(0+4)/2=2,查看槽位2对应的主键是12
  2. 因为10小于12,所以在槽位2之前再进行二分查找,(0+2)/2=1,查看槽位1对应的主键值8
  3. 因为10>8,所以不可能在槽位1中,记录只可能在槽位2中。
  4. 进入槽位2中遍历,查找主键等于10的记录

这个部分固定占用56个字节,用于存储数据页中各种信息,如数据页归属的索引Id、页中存储了多少条记录、第一条记录的地址、页目录中有多少个槽位等等。

File Header

位于数据页头部,用于描述当前页面的基础信息,比如说页的编号、上一个页、下一个页,这个部分占用固定的 38 个字节。

其中FIL_PAGE_PREV 和 FIL_PAGE_NEXT,用于标识上一个页和下一个页,数据页之间由此组成了一个双向链表。InnoDB数据页(FIL_INDEX_PAGE)中这两个字段有值,便于进行范围查询。

File Trailer

用于检测页是否完整,如将内存中更改的页刷新到磁盘上时,怎么判断内存中的页数据全部刷新到磁盘上了。

位于数据页尾部,这个部分由 8 个字 节组成,可以分成2个小部分:

前4个字节代表页的校验和

与File Header 中的校验和相对应。每当一个页面在内存中修改了,在同步之前就要把它的校验和算出来。File Header在页面的前边,所以校验和会被首先同步到磁盘。当刷新完成后,校验File Header和File Trailer中的检验和,如果一致则表示同步成功;不一致则表示同步失败。

后4个字节代表页面被最后修改时对应的日志序列位置(LSN)

也是用于校验页的完整性

标签:记录,查找,InnoDB,File,数据,Page
From: https://www.cnblogs.com/cd-along/p/18107294

相关文章

  • Python大数据为啥一定要用Numpy Array,靠着这份900多页的PDF面试整理
    1.内存占用更小适当地使用Numpy数组替代List,你能让你的内存占用降低20倍。对于Python原生的List列表,由于每次新增对象,都需要8个字节来引用新对象,新的对象本身占28个字节(以整数为例)。所以列表list的大小可以用以下公式计算:64+8*len(lst)+len(lst)*28字节而使......
  • 数据结构(六)——图的遍历
    6.3图的遍历6.3.1图的广度优先遍历⼴度优先遍历(Breadth-First-Search,BFS)要点:1.找到与⼀个顶点相邻的所有顶点2.标记哪些顶点被访问过3.需要⼀个辅助队FirstNeighbor(G,x):求图G中顶点x的第⼀个邻接点,若有则返回顶点号。若x没有邻接点或图中不存在x,则返回-1。Next......
  • 数据结构 - 线性表 - 顺序表
    前言最近刚刚开始复习408数据结构,就想着把每个章节的代码部分汇总记录一下,写成一组文章,便于日后的复习和参考。本系列整体的框架和课后习题参考了王道的复习指导。在本系列的每篇文章中,我会先把该章节所对应数据结构的基础代码放上来,然后附上参考资料习题对应的题目代码。线性......
  • 在 Java 中获取或设置 PDF 元数据
    介绍由于其固定和可呈现的性质,PDF文件被用户和企业广泛用于Web应用程序。这些文件中的每一个都包含“元数据”,它本质上转换为有关数据的数据。PDF元数据包含有关文档的补充信息,例如文档的作者、主题、标题、创建日期等。如果PDF文件最初是通过从原始源文档(即DocX、P......
  • Excel数据库模板导出
    有时候我们不仅需要将excel文件中的数据导入到数据库,同时我们还需要将数据库中的数据或者表字段导出,接下来我们就具体看看如何进行数据库模板导出~我记得需要导入easypoi的相关注解(如果没记错的话):<dependency><groupId>cn.afterturn</groupId><a......
  • delphi基于数据模型(data-model)JSON序列
    delphi基于数据模型(data-model)JSON序列需要DELPHI10.2以上版本才能支持。1)实现JSON序列/还原的泛型模板unitserialize;///<author>cxg2024-1-11</author>interfaceusessystem.Classes,System.SysUtils,System.JSON.Serializers;typeTSerial<T:record>......
  • Python数据分析九
    一、Python之列表操作方法remove和pop在Python中,列表还提供了其他一些常用的操作方法,例如删除指定元素和弹出(移除并返回)指定位置的元素。其中,remove()方法用于删除列表中第一个匹配的元素,而pop()方法用于弹出指定位置的元素。以下是详细的代码示例:使用remove()方法删除列表中......
  • 常见网络数据加密方式
    常见网络数据加密方式1.0单向散列加密这种加密方式的典型是MD5加密,优点:方便存储,损耗低缺点:存在暴力破解的可能散列加密的特点就是从明文到密文的不可映射性,导致我们无法根据加密算法设计出解密算法这种加密的解密方式就是明文到密文,密文有了,就可解密,复杂一点的密文解密可能......
  • 2.python 基本数据类型
    #python基本数据类型#python中等号用来给变量赋值counter=100#整形变量miles=1000.0#浮点型变量name="runoob"#字符串print(counter)print(miles)print(name)#python允许同时为多个变量赋值a=b=c=1print(a)print(b)print(c)#为多个对......
  • 3.python 数据类型转换
    #python数据类型转换"""python数据类型转换可以分为两种:隐式类型转换-自动完成显示类型转换-需要使用类型函数来转换"""#隐式类型转换(自动类型转换)#隐式类型转换中,python会自动将一种数据类型转换为另一种数据类型。#转换规则:低精度向高精度转换(bool->int->......