5.4 【MySQL】页目录

news2025/1/15 6:32:00

记录在页中按照主键值由小到大顺序串联成一个单链表,如果我们想根据主键值查找页中的某条记录,可以这样查询:

SELECT * FROM page_demo WHERE c1 = 3;

我们平常想从一本书中查找某个内容的时候,一般会先看目录,找到需要查找的内容对应的书的页码,然后到对应的页码查看内容。设计 InnoDB 的程序猿为我们的记录也制作了一个类似的目录,他们的制作过程是这样的:

1. 将所有正常的记录(包括最大和最小记录,不包括标记为已删除的记录)划分为几个组。

2. 每个组的最后一条记录(也就是组内最大的那条记录)的头信息中的 n_owned 属性表示该记录拥有多少条记录,也就是该组内共有几条记录。

3. 将每个组的最后一条记录的地址偏移量单独提取出来按顺序存储到靠近 页 的尾部的地方,这个地方就是所谓的 Page Directory ,也就是 页目录 (此时应该返回头看看页面各个部分的图)。页面目录中的这些地址偏移量被称为 槽 (英文名: Slot ),所以这个页面目录就是由 槽 组成的。

比方说现在的 page_demo 表中正常的记录共有6条, InnoDB 会把它们分成两组,第一组中只有一个最小记录,第二组中是剩余的5条记录,看下边的示意图:

从这个图中我们需要注意这么几点:

现在 页目录 部分中有两个槽,也就意味着我们的记录被分成了两个组, 槽1 中的值是 112 ,代表最大记录的地址偏移量(就是从页面的0字节开始数,数112个字节); 槽0 中的值是 99 ,代表最小记录的地址偏移量。

注意最小和最大记录的头信息中的 n_owned 属性

最小记录的 n_owned 值为 1 ,这就代表着以最小记录结尾的这个分组中只有 1 条记录,也就是最小记录本身。

最大记录的 n_owned 值为 5 ,这就代表着以最大记录结尾的这个分组中只有 5 条记录,包括最大记录本身还有我们自己插入的 4 条记录。

99 和 112 这样的地址偏移量很不直观,我们用箭头指向的方式替代数字,这样更易于我们理解,所以修改后的示意图就是这样:

对于最小记录所在的分组只能有 1 条记录,最大记录所在的分组拥有的记录条数只能在 1~8 条之间,剩下的分组中记录的条数范围只能在是 4~8 条之间。

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

1. 通过二分法确定该记录所在的槽,并找到该槽中主键值最小的那条记录。

2. 通过记录的 next_record 属性遍历该槽所在的组中的各个记录。

5.5 Page Header(页面头部)

在页中定义了一个叫Page Header的部分,它是页结构的第二部分,这个部分占用固定的56个字节,专门存储各种状态信息,具体如下:

名称

占用空间大小

描述

PAGE_N_DIR_SLOTS

2 字节

在页目录中的槽数量

PAGE_HEAP_TOP

2 字节

还未使用的空间最小地址,也就是说从该地址之后就是 Free Space

PAGE_N_HEAP

2 字节

本页中的记录的数量(包括最小和最大记录以及标记为删除的记录)

PAGE_FREE

2 字节

第一个已经标记为删除的记录地址(各个已删除的记录通过 next_record 也会组成一个单链表,这个单链表中的记录可以被重新利用)

PAGE_GARBAGE

2 字节

已删除记录占用的字节数

PAGE_LAST_INSERT

2 字节

最后插入记录的位置

PAGE_DIRECTION

2 字节

记录插入的方向

PAGE_N_DIRECTION

2 字节

一个方向连续插入的记录数量

PAGE_N_RECS

2 字节

该页中记录的数量(不包括最小和最大记录以及被标记为删除的记录)

PAGE_MAX_TRX_ID

8 字节

修改当前页的最大事务ID,该值仅在二级索引中定义

PAGE_LEVEL

2 字节

当前页在B+树中所处的层级

PAGE_INDEX_ID

8 字节

索引ID,表示当前页属于哪个索引

PAGE_BTR_SEG_LEAF

10 字节

B+树叶子段的头部信息,仅在B+树的Root页定义

PAGE_BTR_SEG_TOP

10 字节

B+树非叶子段的头部信息,仅在B+树的Root页定义

PAGE_DIRECTION

假如新插入的一条记录的主键值比上一条记录的主键值大,我们说这条记录的插入方向是右边,反之则是左边。用来表示最后一条记录插入方向的状态就是 PAGE_DIRECTION 。

PAGE_N_DIRECTION

假设连续几次插入新记录的方向都是一致的, InnoDB 会把沿着同一个方向插入记录的条数记下来,这个条数就用 PAGE_N_DIRECTION 这个状态表示。当然,如果最后一条记录的插入方向改变了的话,这个状态的值会被清零重新统计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/998598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker配置阿里云镜像加速器

Docker配置阿里云镜像加速器 《Docker安装详细步骤》:Docker安装详细步骤_周十一.的博客-CSDN博客、 在前面博文已经介绍了docker 的安装,因为某些原因,我们下载镜像比较慢,今天给大家介绍一下,如何配置阿里云的镜像加…

解决Ubuntu无法安装pycairo和PyGObject

环境:虚拟机Ubuntu20.04,vscode无法安装pycairo和PyGObject 虚拟机Ubuntu20.04,vscode中运行Anaconda搭建的vens 的Python3.8.10 首先在vscode中点击ctrlshiftp,选择Python3.8.10的环境,自动激活Python 最近在搞无人…

在Linux和Windows上安装seata

1 前言 官网地址:https://seata.io/ 源码地址:https://github.com/seata/seata 官网手册:https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html Seata,一款开源的分布式事务解决方案,致力于提供高性能和简…

STM32CubeProgrammer 用ST-LINK不能烧录 解决方法

如下图所示,连接ST-LINK后可以认出Serial number,点击Connect后,显示“Error : Data read failed”,点击Download后,显示“Error: failed to download Segment[0]”。 此为正常现象,因为芯片加密&#xff0…

docker 容器编排工具 docker-compose从0到精通

compose简介 Docker-Compose 项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose 项目由 Python 编写,调用 Docker 服务提供的API来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以…

redis高可用之主从复制、哨兵模式、集群的概述及部署

目录 redis集群有三种模式 一、主从复制 1、主从复制的概念 2、主从复制的作用 3、主从复制的流程 4、主从复制的缺陷 5、搭建redis主从复制 二、redis 哨兵模式 1、哨兵模式的概念 2、哨兵模式的作用 3、故障转移机制 4、搭建Redis 哨兵模式 三、redis集群 1、r…

iOS开发Swift-12-列表UI,TableViewController,动态响应Button勾选-待办事项App(1)

1.创建新项目 为项目添加图标 2.将Table View Controller添加到界面中 将箭头移动到Table View上来,代表它是首页(根页面).选中ViewController,点击Delete,对它进行删除.将代码ViewController.swift也删除掉. 新建一个Cocoa Touch Class. 将TableViewController的cla…

记LGSVL Map Annotation(1) LGSVL本地编译记录、安装

主要的编译参考来着官方文件 Unity安装 安装unity hub 安装2020.3.3f1在unity hub上 但是我发现没有2020.3.3f1,只有2020.3.3f1c1,其实c1就是中国版,没有什么影响 GIT安装 安装GIT安装Git LFS验证git-lfs(输出Git LFS initialized就&am…

【linux】权限管理 详解(文件/访问者/目录 权限、权限指令、粘滞位... ...)

文章目录 权限的概念linux 权限管理文件访问者的类型(用户)文件类型和访问权限文件类型访问权限 文件权限值的 表示方法文件权限的 设置方法chmodchownchgrpumaskfilesudo 分配权限 目录的权限粘滞位注意 权限的概念 linux中有两种用户: 超级用户&…

Jeecg-Boot /jeecg-boot/jmreport/qurestSql接口sql注入漏洞复现

一、Jeecg-Boot介绍 JeecgBoot 是一款基于代码生成器的低代码开发平台!前后端分离架构 SpringBoot2.x,SpringCloud,Ant Design&Vue,Mybatis-plus,Shiro,JWT,支持微服务。强大的代码生成器让…

淘宝整店商品列表信息API接口介绍

淘宝整店商品列表信息API接口(Taobao whole store product list information API interface)是在开放性API接口的基础之上,根据淘宝官方平台提供的以互联网为发展渠道的电子商务服务,通过数据整合与共享,抽象开发出来的…

java企业数据管理系统

项目介绍 此项目为企业数据管理系统的后端部分,前端部分请参考vue-admin,项目实现了菜单管理、用户管理、角色管理和权限管理四个基础模块,前端菜单管理结合动态路由可自由添加菜单。结合Shiro权限管理实现了菜单和按钮的权限控制。 ❝ 前端…

第36章 封装驱动API接口实验

相信经过前面两个章节的学习已经能够熟练的使用ioctl函数了,在本章节会进行两个实验,每个实验的要完成的任务如下所示: 实验一:通过ioctl对定时器进行控制,分别实现打开定时器、关闭定时器和设置定时时间的功能。 实…

网络基础入门:数据通信与网络基础

1、什么是通信 通信,是指人与人、人与物、物与物之间通过某种媒介和行为进行的信息传递与交流。 2、什么是网络通信 网络通信,是指终端设备之间通过计算机网络进行的通信。 3、常见的术语 术语 说明 数据载荷 最终想要传递的信息 报文 网络中交…

迅为RK3568运行openkylin麒麟系统

RK3568开发板在发布之初已经开发了稳定又好用的Android11/12、Debian、Yocto、BuildrootQT5.15、Ubuntu18/20/22、OpenHarmony v3.2版本等系统。 经过后续的开发,RK3568现已适配openkylin麒麟系统。 CPU:iTOP-3568开发板采用瑞芯微RK3568处理器&#xf…

欠拟合与过拟合

目录 1、相关概念 学习目标 欠拟合与过拟合 2、原因以及解决办法 欠拟合 过拟合 ⭐正则化类别 Lasso 🔺Ridge 🍁Lasso和Ridge的区别 3、拓展 极大似然估计 最大后验估计 最小二乘法 🍃作者介绍:双非本科大三网络工程…

xss-domcobble绕过XSSfilter

目录 DOM破坏的原理 例题 多层标签 HTMLCollection 一些常见的标签的关系 三层标签如何获取 例题 DOM破坏的原理 DOMClobber是一种攻击技术,它利用了DOM(文档对象模型)的特性来破坏或修改网页的结构和功能。 DOMClobber攻击通常发生…

NoSQL之redis高可用(主从复制、哨兵、集群)搭建

目录 一、redis集群的三种模式 1、主从复制 2、哨兵 3、集群 二、Redis的主从复制 1、主从复制的作用 2、主从复制流程 3、搭建Redis 主从复制 实验环境: 3.1 安装 Redis 3.2 修改 Redis 配置文件(Master节点操作) 3.3 配置两台…

YOLO目标检测——交通标志数据集+已标注voc和yolo格式标签下载分享

实际项目应用:交通安全监控、智能交通系统、自动驾驶和辅助驾驶、驾驶员辅助系统、交通规划和城市规划等等。数据集说明:YOLO交通标志检测数据集,真实场景的高质量图片数据,数据场景丰富,图片格式为jpg,分为…