13.1 数据库存储架构

持久性数据存储在非易失存储器中,通常是磁盘或者固态硬盘
  • 磁盘和固态硬盘均是块结构设备,即以块为单位读或者写数据
  • 数据库处理记录,一个记录通常比块小很多
大多数数据库使用操作系统文件作为存储记录的中间层,抽象底层块的细节

13.2 文件组织

数据库被映射到多个不同的文件,一个文件在逻辑上组织成为记录的一个序列,一个记录是多个字段的序列,每条记录被完全包含在单个块中
一种实现方法:假设记录是定长的,每个文件都只有一种特定类型的记录,不同的文件被用于不同的关系,易于实现

定长记录

一种简单的实现方法是从字节n×(i−1)开始存储记录in是每个记录的长度。
这种存储方式存在的缺点包括:
  • 访问记录很容易,但是记录可能会分布在不同的块上。
  • 删除记录困难。删除记录所占的空间必须由文件的其他记录来填充,或者我们自己必须用一种方法标记删除的记录,使得它可以被忽略 。因此删除有三种选择:
      1. 移动后面的记录(向前移动)
      1. 将记录n移到i
      1. 不移动记录, 但是链接所有的空闲记录到一个 free list
notion image

空闲列表

将第一个被删除的记录的地址存储在文件的头部,在第一个被删除记录空间中存储第二个被删除记录的地址,以此类推
notion image
可以将这些存储的地址想象为“指针”,指向下一个空闲记录
更多的有效空间表示:重用空闲记录的属性域存储指针(而未被删除的记录不用存储指针)

变长记录

可变长度的记录的几种方式:
  • 存储在一个文件中的记录有多个记录类型
  • 记录类型允许记录中某些字段值的长度可变(例如varchar
  • 记录类型允许记录中可重复出现同一字段(这种情况常出现在旧的数据模型中)
变长属性使用(偏移量,长度)对来存储。
Null属性使用空值位图来表示
notion image
分槽的页结构
分槽的页结构
  • 实际记录是从块的尾部开始排列
  • 块中空闲空间是连续的,在块头数组的最后一个条目和第一条记录之间
  • 如果插入一条记录,在空闲的尾部给这条记录分配空间,并且将包含这条记录大小和位置的条目添加到块头中
  • 如果一条记录被删除,他所占用的空间被释放,并且他的条目被设置成删除状态。块中被删除记录之前的记录被移动,以此重用删除的空闲空间,并且所有的空闲空间中在块头数组的最后一个条目和第一条记录之间
  • 块头中的空闲末尾指针也要做适当的调整
对于图片、音频等数据,这些数据比块大很多,可以使用 Blob和clob数据类型,大对象一般存储到一个特殊文件中,而不是与记录的其他属性存储在一起,然后一个指向该对象的指针存储到包含该大对象的记录中。

13.3 文件中记录的组织

文件中记录的组织方式有四种

堆文件组织

一个记录可以放在文件中任何地方,只要有足够的空间。
记录放好后通常不会被移动。
notion image

顺序文件组织

记录根据”搜索码“的值顺序存储
适用于需要对整个文件进行顺序处理的应用程序
notion image

哈希文件组织

在每条记录的某些属性上计算一个哈希函数,哈希函数的结果确定了记录应放到文件的哪一块中

多表聚簇文件组织

每个关系的记录存储在一个单独的文件中:在多表聚簇文件组织中一个文件可以存储多个不同关系的记录
使用多表聚簇文件组织,一个文件可以存储几个关系,减少IO次数。
 

划分

表划分:将一个关系的记录分成更小的关系,分别存储
作用
减少查找自由空间的开销
不同分区可以存放在不同介质上,例:近年数据分区放在 SSD, 历史数据分区放磁盘

13.4 数据字典存储

数据字典(系统目录)存储元数据,也就是关于数据的数据:
  • 关系的有关信息:关系的名字,关系中属性的名字、类型、长度,视图的名字和定义,完整性约束
  • 用户和帐号信息,包括密码
  • 统计和描述数据:每个关系中元组的总数
  • 文件的组织信息:关系的存储组织(顺序/哈希等)、关系的存储位置
  • 索引信息
数据字典通常存储成非规范的形式,以便快速存取

13.5 数据库缓冲区

数据库系统尽量减少磁盘和内存之间的数据块传输数量。可以在主存中保留尽可能多的块来减少磁盘访问次数。
缓冲区:部分主存用于存储磁盘块的副本。
当程序需要从磁盘中得到一个块时,将调用缓冲区管理器(负责在主存中分配缓冲区空间的子系统),检查磁盘块是否在缓冲区内。
  • 如果这个块已经在缓冲区里,缓冲区管理器返回这个块在主存中的地址
  • 如果这个块不在缓冲区中,缓冲区管理器需要:
    • 为这个块在缓冲区中分配空间
      • 如果缓冲区满了,替换(抛出)某些块
      • 替换出的块如果被修改则需要写回磁盘
    • 将这个块从磁盘中读到缓冲区中,并将这个块在主存中的地址返回给请求者
操作系统用过去块访问模式来预测未来的访问查询:系统替换掉那些最近最少使用的块 (LRU 策略)
 

13.6 面向列的存储

柱状存储,按属性存储
notion image
优势:
  • 减少IO
  • 提高CPU缓存性能
  • 提高压缩效率
  • 向量处理
不足:
  • 元组重构的代价
  • 元组删除和更新的代价
  • 解压的代价
面向列的存储对决策支持更有效
传统的面向行的存储更适合于事务处理
两种方式都支持:混合的行/列存储  hybrid row/column stores
 
//13.7 主存数据库的存储组织
 
Loading...