数据库的存储是由 一系列文件 组成的,每个文件存储 一系列的记录,每条记录存储 一系列的字段

记录在文件中的组织

定长记录的存储

定长记录就是每条记录都是 固定长度 的,那么也就是说记录存储的位置是固定的,假设每条记录占用 n 字节,那么记录 i (i >= 1),它的偏移字节数(相对于开头)就是 n * (i - 1) 字节

比如说下表,假设每条记录是8字节,那么根据公式,记录1,即 record 0 的偏移字节数就是0,因为它就是开头,那么 记录2,即 record 1 的偏移字节数就是8字节,正好是第二条记录的开头
1

这样存储虽然方便,但是存在一些问题:

  • 记录跨块存储:就是说,一条记录存储在两个块中,在块的末尾存不下后,将剩余的部分存储在另一个块中
    • 解决办法就是直接换一个块存储这条记录就行了
  • 记录的删除:假设我们删除了 record 3 ,为了避免出现空缺,我们可以:
    • 后续的记录全部上移,这样能够保持插入的顺序不变,节省排序成本,但是移动开销大
    • 将最后一条记录移动到这个删除的空缺中,开销较小,在并发操作中较危险
    • 使用链表来记录删除的记录,动态删除记录,只需移动指针,无需真正删除,维护链表的额外开销
      2

变长记录的存储

变长记录的大小不固定,所以我们没法直接获取到一条记录的开头位置,但是可以通过一个中间结构间接获取到它所指向的记录的信息,这个中间结构就是

分槽页结构

3

在该结构中,主要分为三个部分

  • 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 2024-11-04 18:04  Dylaris  阅读(104)  评论(0)    收藏  举报