数据库的存储是由 一系列文件 组成的,每个文件存储 一系列的记录,每条记录存储 一系列的字段
记录在文件中的组织
定长记录的存储
定长记录就是每条记录都是 固定长度 的,那么也就是说记录存储的位置是固定的,假设每条记录占用 n 字节,那么记录 i (i >= 1),它的偏移字节数(相对于开头)就是 n * (i - 1) 字节
比如说下表,假设每条记录是8字节,那么根据公式,记录1,即 record 0 的偏移字节数就是0,因为它就是开头,那么 记录2,即 record 1 的偏移字节数就是8字节,正好是第二条记录的开头

这样存储虽然方便,但是存在一些问题:
- 记录跨块存储:就是说,一条记录存储在两个块中,在块的末尾存不下后,将剩余的部分存储在另一个块中
- 解决办法就是直接换一个块存储这条记录就行了
- 记录的删除:假设我们删除了
record 3,为了避免出现空缺,我们可以:- 后续的记录全部上移,这样能够保持插入的顺序不变,节省排序成本,但是移动开销大
- 将最后一条记录移动到这个删除的空缺中,开销较小,在并发操作中较危险
- 使用链表来记录删除的记录,动态删除记录,只需移动指针,无需真正删除,维护链表的额外开销
![2]()
变长记录的存储
变长记录的大小不固定,所以我们没法直接获取到一条记录的开头位置,但是可以通过一个中间结构间接获取到它所指向的记录的信息,这个中间结构就是 槽
分槽页结构

在该结构中,主要分为三个部分
- Block Header: 块的头部,存储一些信息
- 块内存储的记录数目
- 块内空闲空间的末尾位置
- 每个块的偏移位置和具体大小 (槽)
- Free Space: 空闲空间,位于中间部分,当插入一条记录时,前面会增加对应的槽,后面是具体的记录,就有种两边挤压中间的感觉
- Records: 记录
分槽页结构中的记录可以自由移动,及时填补了记录之间的空缺,同时还要记得更新头部信息
文件组织
以下是对不同文件组织方式的简单介绍:
Heap Organization
- 概念:在堆组织中,记录可以随意放置在文件中,只要有空间即可
- 特点:没有特定的顺序,插入和删除操作较为简单,但检索特定记录的效率可能较低
Sequential Organization
- 概念:顺序组织将记录按照 搜索键 的值进行排序并依次存储
- 特点:
- 适合于顺序访问,检索速度较快,特别是在范围查询时效率高
- 使用链表管理插入和删除操作,较为复杂,因为需要维护顺序
Hashing
- 概念:使用哈希函数计算每条记录的某个属性值,以确定该记录应该存放在哪个文件块中
- 特点:适合于快速检索特定记录,但可能会发生冲突(即多个记录映射到同一个块),需要处理冲突的策略
Multitable Clustering
- 概念:在多表聚类文件组织中,可以将不同关系的记录存储在同一个文件中
- 特点:
- 将相关记录存放在同一个块中,可以减少I/O操作,提高访问效率
- 仅查找一个关系的记录时,查询效率低,可以使用链表将同一个关系的记录串联起来
数据存储的访问
数据库文件被划分为固定长度的存储单元,称为块(blocks),这些块既是存储分配的单位,也是数据传输的单位。数据库系统的目标是最小化磁盘和内存之间的块传输次数。通过 尽可能多地将块保留在主内存中,可以减少磁盘访问次数。
- 块:固定长度的存储单位,负责存储和传输数据。
- 缓冲区(Buffer):主内存中用于存储磁盘块副本的部分。
- 缓冲区管理器(Buffer Manager):负责在主内存中分配缓冲区空间的子系统。
缓冲区管理器的工作原理
当程序需要从磁盘获取一个块时,缓冲区管理器会首先检查该块是否已经在缓冲区中
- 如果块已在缓冲区:缓冲区管理器返回该块在主内存中的地址。
- 如果块不在缓冲区:
- 为该块在缓冲区中分配空间
- 如果需要,替换掉其他块以腾出空间。被替换的块只有在自上次写入或获取后 被修改时 才会写回磁盘
- 从磁盘读取该块到缓冲区,并返回在主内存中的地址
缓冲区替换策略
-
最少最近使用(LRU)策略:
- 目的:通过追踪块的引用历史,选择 最久未使用 的块进行替换,以此来预测未来的引用
- 适用场景:适合大多数常见的访问模式,尤其是那些具有时间局部性(即近期使用的块很可能会再次被使用)的场景
- 优点:有效减少缓存未命中率,提升系统性能
-
固定块(Pinned Block):
- 目的:确保某些关键块在处理过程中不会被替换,即不允许写回磁盘
- 适用场景:用于临时存储重要数据或正在处理的数据块,确保在处理期间不被丢弃
- 优点:防止重要数据在处理时被意外替换,确保数据的完整性和可用性
-
即时丢弃策略 (Toss-immediate):
- 目的:在处理完块中最后一个元组后,立即释放该块所占的缓冲区空间
- 适用场景:适合短期使用的块,尤其是处理完毕后无需保留的情况
- 优点:减少内存占用,迅速为新请求释放空间
-
最常用(MRU)策略:
- 目的:在处理过程中将当前块固定,完成后再将其解固定,使其成为“最近使用”块
- 适用场景:适合于处理当前操作的块需要优先保留的场合
- 优点:有效处理当前活跃的数据,有助于在处理高频数据时提升性能

posted on
浙公网安备 33010602011771号