【Database System Concept 7th】Chapter 13读书笔记

Chapter 13 Data Storage Structures

  • [13.2 File Organization](#13.2 File Organization)
    • [13.2.0 Introduction](#13.2.0 Introduction)
    • [13.2.1 Fixed-Length Records](#13.2.1 Fixed-Length Records)
    • [13.2.2 Variable-Length Records](#13.2.2 Variable-Length Records)
    • [13.2.3 Storing Large Objects](#13.2.3 Storing Large Objects)
  • [13.3 Organization of Records in Files](#13.3 Organization of Records in Files)
    • [13.3.0 Introduction](#13.3.0 Introduction)
    • [13.3.1 Heap File Organization](#13.3.1 Heap File Organization)
    • [13.3.2 Sequential File Organization](#13.3.2 Sequential File Organization)
    • [13.3.3 Multitable Clustering File Organization](#13.3.3 Multitable Clustering File Organization)
    • [13.3.4 Partitioning](#13.3.4 Partitioning)

13.2 File Organization

13.2.0 Introduction

这一节主要介绍数据库中的数据(或者说记录)在文件的最小组成单位,磁盘 中的组织形式,我们学过操作系统的都知道,文件在存储容器(磁盘或硬盘)中以 的形式存在,但是数据库中的记录大小可能很大。为了起到循序渐进的介绍效果,我们先假设所有记录的大小都小于一个块的大小 ,大小比较大的记录的处理方法会在13.2.2节介绍(大致就是分开来存储,并且增加索引方便重新拼接);同时,我们需要规定,一条记录完整包含于一个块中 ,就是说一个比块小的记录不会分开存储。

由于每条记录的大小也可能不一,一般有两种组织方式,一种是用多种文件 ,每一种文件存一种大小的记录;另一种就是支持变长记录的结构化文件 ;在这里,我们先考虑使用前者存放固定长度的记录 ,后面再介绍在这种组织方式下如何实现变长记录的存储

13.2.1 Fixed-Length Records

这一小节主要介绍了固定长度记录存储模型 的两个问题以及解决思路。

定长记录存储模型的两个问题:

  • 记录长度与块大小不匹配(不整除),可能导致某些记录分开在两个块中存放
  • 记录删除时如何处理

第一个问题的解决方法很简单,我们让不整除的块最后的空间浪费 即可,具体来说,若每个块长度为X,记录长度为Y,则每个块只存放 ⌊ X / Y ⌋ \lfloor X / Y \rfloor ⌊X/Y⌋条记录。

对于第二个问题,暴力的解决方法是将被删除记录后面的所有记录往前移动 ,这种做法很影响效率,肯定不行。我们可以将被删除的记录用链表串起来,形成一个空闲块链表 ,类似下图。

这种链表的做法也有一定的问题,就是如果记录是变长的,那么空闲链表中的空闲块可能没法满足新插入的记录长度 或者插入的记录长度比空闲块大小小得多,这个问题在下一节探讨。

13.2.2 Variable-Length Records

这一小节也是解决两个问题:

  • 记录存储结构如何设计使得能够简单的提取出每一个字段,即使存在变长字段
  • 变长记录在block中的存储结构如何设计使得能够简单的提取出block中的每一条记录

首先看第一个问题,采用的方法是将记录中的变长部分与定长部分分开,一条记录分为两部分,称为定长区与变长区。定长区 存放定长字段内容变长字段的偏移量和长度变长区 则存放变长字段的实际内容 ,如下图。在定长区与变长区中,会有若干字节存放一个bitmap,用于记录哪些字段是空的 。在某些数据库的实现中,bitmap会安排在记录存储位置的最前方,而空字段将不再用另外的空间存储(相当于只用bitmap中的一个位来存储空字段),在某些场景下比较节省空间(如空字段很多的记录

对于第二个问题,就是若干记录在block中的组织形式,一般采用一种叫slotted-page的结构,大致如下图所示。在block的最前面,会存放一个Header,用于记录一些元数据:

  • 头部的Entries数(我理解就是block中当前存放的记录数)
  • 空闲区尾部的位置
  • Entries数组,每个元素表示一条记录的位置和长度

从下图也可以看出,空闲区被夹在中间,当有新纪录插入时,空闲区尾部会被分配给这个新纪录 ,同时更新Header;当有某个记录被删除时,在删除记录前面的记录需要被移动,将空闲区合并起来 (这里感觉怪怪的,但是书里说因为一个块不会很大,4KB或者8KB,所以这个移动不怎么影响效率)。

13.2.3 Storing Large Objects

这一节讲的不是很细,大概聊了下庞大对象的存储方式,要么以文件形式存储在数据库管理的文件区域 ,要么以文件结构形式存放在数据库中并由数据库管理。后者用B+树来维护,在14.4.1节会详细介绍。

13.3 Organization of Records in Files

13.3.0 Introduction

本节主要介绍了一些常用的文件组织结构:

  • Heap File Organization:堆叠式结构,记录无序,就是随便放
  • Sequential file organization:序列结构,记录有序,但是维护效率低
  • Multitable clustering file organization:一个文件甚至一个盘块,可以存放多个关系的记录,便于一些关系的join操作
  • B±tree file organization:B+树结构,记录有序,维护效率高
  • Hashing file organization:哈希结构,和索引结构有关

本节介绍前三个结构,后面两个会在14.4.1和14.5介绍。

13.3.1 Heap File Organization

13.3.2 Sequential File Organization

13.3.3 Multitable Clustering File Organization

13.3.4 Partitioning

相关推荐
yangchanghua1111 小时前
pgsql 如何查询今天范围内的数据(当天0点0分0秒 - 当天23点59分59秒....)
数据库·pgsql
larance1 小时前
SQLAlchemy 的异步操作来批量保存对象列表
数据库·python
python_chai1 小时前
从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
数据库·sql·mysql
在努力的前端小白1 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
未来之窗软件服务1 小时前
自建知识库,向量数据库 (九)之 量化前奏分词服务——仙盟创梦IDE
数据库·仙盟创梦ide·东方仙盟·自建ai·ai分词
冒泡的肥皂5 小时前
MVCC初学demo(一
数据库·后端·mysql
.Shu.6 小时前
Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
数据库·redis·架构
薛晓刚8 小时前
当MySQL的int不够用了
数据库
SelectDB技术团队9 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
星空下的曙光9 小时前
mysql 命令语法操作篇 数据库约束有哪些 怎么使用
数据库·mysql