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

文章目录

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


前言

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

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

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

首先想一个问题:有一天,你开着自己心爱的大型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.rhkb.cn/news/322087.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录Day 41|Leetcode|Python|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

198.打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个…

linux上go项目打包与部署

1.第一步把项目打包 1.确保本地goland的操作系统为linux go env找到GOOS如果为window就修改为Linux 修改命令为 go env -w GOOSlinux2.打包 在项目根目录下输入 go build main.go然后项目根目录下会出现一个mian的二进制文件 3.上传包 将 main 程序包放到服务的目录下&…

python与java用途区别有哪些

区别: 1.Python比Java简单,学习成本低,开发效率高。 2.Java运行效率高于Python,尤其是纯Python开发的程序,效率极低。 3.Java相关资料多,尤其是中文资料。 4.Java版本比较稳定,Python2和3不…

全双工音频对讲模块-支持空中升级、多级无线中继

SA618F30是一款高集成的大功率全双工无线音频模块,发射功率高达32dBm。该音频模块简化接口,只需外接音频功放或麦克风即可作为一个小型对讲机,方便快捷嵌入到各类手持设备中。支持多级无线中继,支持OTA空中升级。 SA618F30配备1W…

Flutter笔记:Widgets Easier组件库(11)- 使用提示吐丝(Tip Toasts)

Flutter笔记 Widgets Easier组件库(11)使用提示吐丝 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …

LearnOpenGL(九)之材质

一、材质 在现实世界里,每个物体会对光产生不同的反应。比如,钢制物体看起来通常会比陶土花瓶更闪闪发光,一个木头箱子也不会与一个钢制箱子反射同样程度的光。在opengl中,我们可以针对每种表面定义不同的材质(Material)属性来模…

电子商务对应的职业有哪些?10年互联网人透底行业秘密!

电子商务对应的职业有哪些?10年互联网人透底行业秘密! 事实说话,实事求是,不要再把美颜滤镜下的市场,传给新人小伙伴了! 大家好,我是微三云胡佳东,一家软件公司负责人! …

五一 作业

#include <iostream>using namespace std; class Num { private:int a; public:Num() {}Num(int a):a(a){}//设置a的值void set(int a){this->aa;}//1-a的和void Sum(){if(a<1){cout<<"a<1"<<endl;return;}int sum0;for(int i1;i<a;i)…

十分钟掌握Java集合之List接口

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

风格迁移——CAP-VSTNet训练自己数据集并推理测试(详细图文教程)

目录 一、CAP-VSTNet二、源码包准备三、环境准备四、数据集准备4.1 源码包中数据集4.2 动漫风格数据集4.3 MS_COCO数据集 五、训练5.1 训练配置参数修改5.2 开始训练5.2.1 训练真实感模型5.2.2 训练艺术感感模型 5.3 训练过程5.4 模型输出保存 六、测试6.1 单帧图片测试6.1.1 测…

Leetcode—163. 缺失的区间【简单】Plus

2024每日刷题&#xff08;126&#xff09; Leetcode—163. 缺失的区间 实现代码 class Solution { public:vector<vector<int>> findMissingRanges(vector<int>& nums, int lower, int upper) {int n nums.size();vector<vector<int>> an…

数字工厂管理系统如何实现生产过程透明化

随着科技的飞速发展&#xff0c;数字化转型已成为制造业不可逆转的趋势。数字工厂管理系统作为实现生产自动化、智能化的重要工具&#xff0c;其在提升生产效率、降低运营成本、优化资源配置等方面的作用日益凸显。其中&#xff0c;实现生产过程的透明化是数字工厂管理系统的重…

HTML Audio标签src使用base64字符

源码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>Audio src base64</title> </head> <body><audio controls><source src"data:audio/mp3;base64,//OIxAAAAAAAAAA…

嵌入式linux学习第三天汇编语言点灯

嵌入式linux学习第三天汇编语言点灯 今天学习如何在linux板子上点灯。 I.MX6U GPIO 详解 我们发现I.MX6U GPIO是分为两类的&#xff0c;&#xff1a;SNVS 域的和通用的。在讨论i.MX6U或类似的复杂微处理器时&#xff0c;了解其GPIO&#xff08;通用输入输出&#xff09;引脚…

IoTDB 入门教程 基础篇③——基于Linux系统快速安装启动和上手

文章目录 一、前文二、下载三、解压四、上传五、启动六、执行七、停止八、参考 一、前文 IoTDB入门教程——导读 二、下载 下载二进制可运行程序&#xff1a;https://dlcdn.apache.org/iotdb/1.3.1/apache-iotdb-1.3.1-all-bin.zip 历史版本下载&#xff1a;https://archive.…

【软考高项】三十六、资源管理6个过程

一、规划资源管理 1、定义、作用 定义&#xff1a;定义如何估算、获取、管理和利用团队以及实物资源的过程作用&#xff1a;根据项目类型和复杂程度确定适用于项目资源的管理方法和管理程度 2、输入 项目管理计划 质量管理计划、范围基准项目章程 项目文件 需求文件…

ComStar系统架构介绍

中国外汇交易中心为适应市场需要&#xff0c;开发推出了ComStar外汇资金交易管理系统&#xff0c;该系统能够快速响应市场变化及监管机构的新要求&#xff0c;通过与交易中心银行间市场的外汇交易系统无缝连接&#xff0c;为市场成员提供了更为高效、便利、安全稳定的外汇资金业…

项目管理-项目绩效域2/2

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 八大绩效域包括&#xff1a;“团干部 策划开公交” 团队、干系人、不确定性、测试、规划、开发方法与生命周期、项目工作、交付。 上节…

Unity 性能优化之光照优化(七)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、测试目的一、实时光源是什么&#xff1f;二、开始测试1.场景中只有一个光照的数值情况2.添加4个点光源后4.结果 总结 前言 实时光源数量越多&#x…

学习软考----数据库系统工程师25

关系规范化 1NF&#xff08;第一范式&#xff09; 2NF&#xff08;第二范式&#xff09; 3NF&#xff08;第三范式&#xff09; BCNF&#xff08;巴克斯范式&#xff09; 4NF&#xff08;第四范式&#xff09; 总结