【如此简单!数据库入门系列】之无序不代表混乱 -- 堆文件

文章目录

  • 前言
  • 堆文件
  • 链表实现
  • 页目录实现
  • 总结
  • 系列文章


前言

还记得上次遗留的问题吗?

以什么组织方式将数据保存在磁盘中?

今天我们接着讨论这个问题。

首先想一个问题:有一天,你开着自己心爱的大型SUV去超市购物。在停车场入口看到,剩余车紧缺。你该如何先人一步找到合适的车位?

假如,你是这个超市的老顾客,非常熟悉这里停车场的布局和规则,那么你就更有可能快速找到车位。

停车场的布局和规则,类似于数据库中数据文件的文件组织。


堆文件

堆文件是最常见的数据文件组织形式。

堆文件(Heap File):

  • 数据库最常用的文件组织形式,常用于OLTP型数据库
  • 它对页(Page)和记录(Record)没有任何顺序上的要求
  • 可以根据需求,将记录插入任何合适的位置
  • 页和记录的组织方式,完全由实现者自己定义

堆文件通常有两种实现方式:链表和页目录。


链表实现

在这里插入图片描述

在链表实现中:

  • 每个数据页(Data Page)包含记录(Record)、指向下一页和上一页的指针
  • 有一个头页(Header Page)作为文件的开始,用于将数据页划分为满页和空闲页

在链表实现的堆文件中插入一条记录可以分解为三个动作。

1. 找空位置

  • 先找到头页
  • 顺着空闲页链表找一个合适的空位
  • 如果空闲页链表为空,或者找不到合适的位置,则追加一个空闲页到空闲页链表中

2. 将记录写入空位置
3. 必要时更新链表

  • 如果当前空闲页已写满,则将它从空闲页链表移动到满页链表的最前方
  • 把它移到满页链表的最前面,是为了提高效率,因为不用遍历整个满页链表

拿停车举例子(如上图右侧所示)。

假设停车场有A、B、C和D四个区域。每当一个区域停满时,管理员会在区域入口放一个禁止入门的路障。这样司机可以快速找到第一个有空位的区域。

你会沿着箭头的方向找到一个适合的空闲车位:

  • 因为有路障,你快速驶过A区和B区
  • 驶入第一个有空位的区域 - C区
  • 发现C区的唯一的空位太小,大型SUV停不进去
  • 继续驶入下一个有空位的区域 - D区
  • 停入D区最后一个空闲车位
  • 此时,管理员会在D区放置路障

页目录实现

在这里插入图片描述

在页目录的实现中:

  • 每个头页包含一个指向下一个头页的指针,形成页目录
  • 每个头页中的记录包含指向数据页的指针和该页的空闲空间信息
  • 数据页只存储记录,它们不再需要指向相邻数据页的指针

在页目录实现的堆文件中插入一条记录同样分解为三个动作。

1. 找空位置

  • 找到第一个头页,根据头页中记录包含的空闲空间信息,找到一个包含合适空位的数据页
  • 如果当前头页找不到,则继续遍历下一个头页
  • 如果头页链表为空,或者找不到合适位置,则追加新的头页和数据页

2. 将记录写入空位置

  • 顺着头页中记录指向数据页的指针,找到对应的数据页
  • 在数据页中找到对应的空位,写入数据

3. 更新状态

  • 更新头页中有关数据页空闲空间的信息

接着拿停车举例子(如上图右侧所示)。

假设一个停车场经过了信息化改造,在停车场入口处的显示屏上,显示每个区域的每个车位的状态(是否被占用)和信息(车位尺寸)。

你也会沿着箭头的方向找到一个适合的空闲车位:

  • 行驶到显示屏处,找到一个合适的空位,并记录位置(例如D区03车位)
  • 直接行使到D区03车位
  • 显示屏更新D区03车位状态,变为已被占用

总结

我们先从写的角度进行对比:

写入动作链表实现页目录实现
找空位从第一个空闲页开始找
最差情况:追加新的空闲页
平均情况:
- 可能访问较多数据页才能找到合适空位
- 例如1号停车场中存在走冤枉路的问题
顺着页目录开始找
最差情况:追加新的头页和数据页
平均情况:
- 由于空闲信息记录(包含空闲状态和空闲信息)要远小于数据记录
- 因此头页可以包含更多的空闲信息记录
- 也就是说遍历更少的头页就可以找到合适的空位
- 不存在走冤枉路
写记录因为是直接在数据页中找空位,找到空位后直接写入即可,没有额外成本需要从头页中跳转到数据页中的空位,存在额外成本,但成本较低
状态更新记录写入空位后,需要更新数据页头部包含空位状态的信息
最坏情况:额外需要修改数据页的指针,从空闲链表移到满页链表
更新头页中的状态信息

再从删除角度对比:

写入动作链表实现页目录实现
找记录遍历数据页(不考虑所以的情况下)相同
删记录在数据页头部中将对应的记录标记为删除,将数据页插入到空闲页链表头部在数据页头部中将对应的记录标记为删除,更新头页中的空闲信息
辅助成本定期清理空间相同

由此可见:

  • 页目录的优点是插入记录通常更快。只需读取头页就可以找到空位,需要执行的磁盘I/O更少,因此速度更快
  • 页目录适用于频繁地写、更新和删除的场景(数据页中有很多零散的空位)
  • 链表实现更简单,适用于写多,但更新和删除较少的场景(此时空闲页链表尽可能短,磁盘I/O次数尽可能少,找空位时间也尽可能短)

系列文章

更多系列文章,请参考:【如此简单!数据库入门系列】之思想地图 – 系列目录


如果喜欢这篇文章,请不要忘记关注、点赞和收藏哦!
您的鼓励将是我创作的最大动力!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

roblox国际服游戏充值付款订阅Robux套装商城会员,roblox国际服虚拟信用卡充值教程

roblox是一款由Roblox公司开发的大型多人在线游戏创建平台,该平台允许用户设计自己的游戏、物品及衣服,以及游玩自己和其他开发者创建的各种不同类型的游戏。 没有账号注册一个账号,他支持多种平台授权登录,我这里直接选择注册一个…

2024蓝桥杯CTF writeUP--缺失的数据

压缩包的内容 里面有secret.txt文件,用ARCHPR工具套上字典,爆破压缩包密码。密码为pavilion 解压得到原图,并且有了加密后的图片,根据代码里的key和参数直接运行脚本解密水印图片: import cv2 import numpy as np imp…

qt5-入门-xml文件读写

本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt 5.12 代码已经测试通过。其他例子日后更新。 假设需要读写的xml文档结构如下图所示&#xff1a; 那么首先需要修改.pro文件&#xff0c;增加一句&#xff1a; 然后执行qmake。 代码 #include <QtXml/Q…

您的浏览器不支持 undefined 代理认证!如有问题请联系您的浏览器支持,请勿反馈此问题给 SwitchyOmega.

一、【问题描述】 PAC 文件是一个 JavaScript 文件&#xff0c;用于定义客户端的代理规则。您可以在 PAC 文件中编写规则&#xff0c;根据不同的目标网址或其他条件&#xff0c;决定是否通过代理服务器进行访问。您可以将 PAC 文件部署到服务器上&#xff0c;并在客户端配置浏…

一篇教程搞定Windows系统中的Docker应用安装

文章目录 1. 引言2. “Docker -> WSL -> Windows”的依赖逻辑3. 安装方法3.1 安装WSL3.2 安装Docker Desktop 4. 是否安装成功&#xff1f;初始化一个容器试试。FAQ 1. 引言 Docker是一个用于创建、管理和编排容器的应用。容器是运行在操作系统上的一个应用&#xff0c;…

SharePoint 使用renderListDataAsStream方法查询list超过5000时的数据

问题&#xff1a; 当SharePoint List里的数据超过5000时&#xff0c;如果使用常用的rest api去获取数据&#xff0c;例如 await this.sp.web.lists.getByTitle(Document Library).rootFolder.files.select(*, listItemAllFields).expand(listItemAllFields).filter(listItemA…

.net 6.0 框架集成ef实战,步骤详解

一、代码框架搭建 搭建如下代码架构: 重点含EntityFrameworkCore工程,该工程中包含AppDbContext.cs和数据表实体AggregateObject 1、AppDbContext 代码案例 //AppDbContext 代码案例using Microsoft.EntityFrameworkCore;namespace EntityFrameworkCore {public class Ap…

STM32-HAL库12-STM32F407VGT6的PWM主从定时器,发送指定数量脉冲

STM32-HAL库12-STM32F407VGT6的PWM主从定时器&#xff0c;发送指定数量脉冲 一、所用材料 STM32F407VGT6自制双伺服电机控制板&#xff1b; 一川A1系列伺服电机驱动器&#xff08;电0.73KW电机&#xff09;&#xff1b; 二、所学内容 实现PWM发送指定个数脉冲&#xff0c;以…

Https协议加密过程,中间人攻击详解

在上一篇博客中我们讲到了http协议http://t.csdnimg.cn/OsvCh&#xff0c;没看过之前建议先瞅瞅。 https本质就是对http协议进行了一层加密。为什么要进行加密呢&#xff0c;也参考上面一篇文章&#xff0c;涉及到运营商劫持。 因为http是明文传输&#xff0c;所以要对http进…

An Embarrassingly Easy but Strong Baseline for Nested Named Entity Recognition

任务描述&#xff1a; NER 是检测和分类文本中实体范围的任务。当实体范围在文本中彼此重叠时&#xff0c;这个问题被称为嵌套 NER。 解决方法&#xff1a; 使用基于跨度的方法来处理嵌套 NER&#xff0c;其中大多数方法将得到一个 n n 的分数矩阵&#xff0c;其中 n 表示句子…

Compose 生命周期和副作用

文章目录 Compose 生命周期和副作用生命周期副作用APIDisposableEffectSIdeEffectLaunchedEffectrememberCoroutineScoperememberUpdatedStatesnapshotFlowproduceStatederivedStateOf Compose 生命周期和副作用 生命周期 OnActive&#xff1a;添加到视图树。即Composable被首…

有哪些有效的复习方法可以帮助备考软考?

软考目前仍然是一个以记忆为主、理解为辅的考试。学过软考的朋友可能会感到困惑&#xff0c;因为软考的知识在日常工作中有许多应用场景&#xff0c;需要理解的地方也很多。但为什么我说它是理解为辅呢&#xff1f;因为这些知识点只要记住了&#xff0c;都不难理解&#xff0c;…

快速传输大文件:手机电脑互传文件的最佳解决方案

无论是工作还是生活&#xff0c;我们都可能需要将照片、视频、音乐或其他类型的文件从一台设备发送到另一台设备。然而&#xff0c;由于网络速度的限制&#xff0c;传统的文件传输方法可能会非常耗时。那么&#xff0c;有没有一种快速传输大文件的解决方案呢&#xff1f;答案是…

Linux网络编程(三)IO复用一 select系统调用

I/O复用使得程序能同时监听多个文件描述符。在以下场景中需要使用到IO复用技术&#xff1a; 客户端程序要同时处理多个socket&#xff0c;非阻塞connect技术客户端程序要同时处理用户输入和网络连接&#xff0c;聊天室程序TCP服务器要同时处理监听socket和连接socket服务器要同…

【JAVA |数组】数组定义与使用、常见的Arrays类介绍

目录 一、前言 二、数组的创建和初始化 三、数组的使用 四、数组是引用类型 1.JVM的内存分配 2.与引用类型变量 3.null 五、二维数组 六、Java中Arrays类的常用方法 1. Arrays.fill ->填充数组 2. Arrays.sort ->数组排序 3. Arrays.toString ->数组打印 …

数据中台:企业数字化转型的驱动力量_光点科技

在当今数字化快速发展的时代&#xff0c;企业正积极寻求转型升级的新路径。在这个过程中&#xff0c;数据中台以其独特的功能和价值&#xff0c;逐渐成为了企业数字化转型的关键驱动力。本文将深入探讨数据中台的角色、架构及其在企业中的应用&#xff0c;以期为企业的数字化转…

十个数据安全最佳实践:保护数据的简单方法

在德迅云安全将介绍数据安全的主要原则&#xff0c;并了解适用于大多数行业的 10 种数据安全最佳实践&#xff0c;以及云端安全检测的重要性。 数据威胁和维护数据安全的好处 什么是数据安全&#xff1f; 数据安全是旨在保护组织敏感资产的流程和工具的组合。有价值的数据在…

多核DSP并行计算跨平台通信解决方案

并行计算的核心是计算节点以及节点间的通信与协调机制。OpenMP虽然给开发者提供了极易上手的增量式开发方式&#xff0c;但是OpenMP在与复杂架构的MCSDK结合后&#xff0c;工具与代码产生了大量不可调试的黑盒子&#xff0c;更是决定了它不能用于关键任务领域&#xff0c;如军工…

C语言(指针)1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

用python写个控制MicroSIP自动拨号和定时呼叫功能(可用在小型酒店叫醒服务)

首先直接上结果吧&#xff0c;MicroSIP 助手&#xff0c;控制MicroSIP自动拨号&#xff0c;定时呼叫的非常实用小工具&#xff01; 在使用MicroSIP 助手之前&#xff0c;我们需要了解MicroSIP是什么&#xff0c;MicroSIP是一个SIP拨号软件&#xff0c;支持注册任意SIP平台实现拨…
最新文章