文章目录
第十章:存储和文件结构
10.1 物理存储介质概述
物理存储介质分类
1.数据访问的速度
2.每单位数据的成本
3.可靠性
- 易失性存储,电源断电后失去内容
- 非易失性存储,电源断电后内容仍然保持,包括辅助存储和三级存储, 以及带有备用电池的主存
4.联机存储和脱机存储
5.顺序访问和直接访问
存储层次
物理存储介质有以下几种
- 高速缓冲存储器
- 主存储器
- 快闪存储器
- 磁盘存储器
- 光学存储器
- 磁带存储器
几级存储
1.基本存储
- 访问速度最快的存储介质,但是易失(cache, 主存)
2.辅助存储
- 层次结构中基本存储介质的下一层介质, 非易失, 访问速度较快
也称为联机存储,如:闪存, 磁盘
3.第三级存储
- 层次结构中最底层的介质, 非易失,访问速度慢
也称为脱机存储,如:磁带, 光学存储器
10.2 磁盘和快闪存储器
磁盘地物理结构
磁盘的每一个盘片是扁平的圆盘,它的两个表面都覆盖着磁性物质,信息记录在表面上
盘片从逻辑上被分为磁道,磁道又被分为扇区,扇区是磁盘读取和写入的最小单位
磁盘访问的优化
数据在磁盘和主存之间交换是以块为单位的
一个块是一个逻辑单元,它包含固定数目的连续扇区
10.5 文件组织
一个数据库被映射到多个不同的文件,这些文件由底层的操作系统来维护。这些文件永久地存在于磁盘上。
一个文件在逻辑上组织成为记录的一个序列。这些记录被映射到磁盘块上。
每个文件都被分成定长的存储单元,称为块。块是存储分配和数据传输的基本单元。大多数数据库默认采用4-8KB的块的大小。
10.5.1 定长记录
比如对于这张teacher表,文件中的每个记录定义(使用伪代码)如下:
type teacher = record
tno char(5);
name char(20);
dno char(20);
sal number(8,2);
end
假设每个字符占一个字节,则number(8,2)占8个字节,总共需要为teacher的一条记录分配53个字节。
最简单的方法是使用最开始的53个字节存储第一条记录,而接下来的53的字节存储第二条记录,以此类推
但上面这种简单的方法有两个问题
- 除非块的大小恰好是53的倍数,否则一些记录会横跨两个或多个块。而读写这一条记录需要两次块访问
- 从结构种删除一条记录非常困难,因为删除的空间需要由文件中的其它记录来填充
解决第一个问题的方法:在一个块中只分配它能完整容纳下的最大记录数。块中剩下的字节则不使用
在删除和插入新数据时,会遇到一些比较麻烦的情况,因此需要引入额外的结构
在文件的开始处设置文件头,文件头包含文件的各种信息,在文件头中还储存了被删除的第一个记录的地址。用这一记录来存储第二个可用记录的地址,以此类推。
可以简单地将这些看作指针,被删除地记录形成了一条链表,被称为空闲列表
当插入新记录时,使用文件头所指向的内容,改变文件头的指针以指向下一个可用记录。如果没有可用的空间,就直接将这条新记录添加到文件末尾
10.5.2 变长记录
一条有变长属性的记录的表示通常具有两个部分:初始部分是定长属性,接下来是变长属性。
对于定长部分,直接分配所需的字节数。对于变长属性(如varchar),在记录的初始部分中表示为一个键值对(偏移量,长度),偏移量表示一条记录中该属性的数据开始的位置,长度表示变长属性的字节长度。
例
以一个instructor记录为例,它的前三个属性ID,name,dept_name是变长字符串,第四个属性salary是一个大小固定的数值。
表示如下
空位图用于表示哪个属性是空值,在这个记录中,如果salary是空值,该位图的第4位将置为1。存储在12~19字节的salary的值将被忽略
块中存储变长记录结构:分槽的页结构
文件组织-大记录
对于图片、音频等数据,这些数据比块大很多,可以使用blob和clob数据类型,大对象一般存储到一个特殊文件中,而不是与记录的其他属性存储在一起,然后一个指向该对象的指针存储到包含该大对象的记录中。
大对象存储的实现:指针+文件
10.6 文件中记录的组织
关系是记录的集合。给定一个记录的集合之后,如何在文件中组织它们呢?
文件中组织记录的几种可能的方法
- 堆文件组织:一条记录可以放在文件中的任何地方,只要那个地方有空间。记录是没有顺序的,每个关系使用一个单独的文件
- 顺序文件组织:记录根据其“搜索码”的值顺序存储
- 散列文件组织:每条记录的某些属性上计算一个散列函数,散列函数的结果确定了记录应存放到文件夹的哪个块中
通常,每个关系的记录用一个单独的文件存储。但在多表聚簇文件组织中,几个不同关系的记录存储在同一个文件中。
10.6.1 顺序文件组织
- 顺序文件组织适用于需要对整个文件进行顺序处理的应用程序
- 记录在搜索码上排序
在插入和删除时,需要对文件进行重组以维持顺序
10.6.2 多表聚簇文件组织
多表聚簇文件组织是一种在每一块中存储两个或者更多个关系的相关记录的文件结构。这样的文件组织允许我们使用一次块的读操作来读取满足连接条件的记录。
多表聚簇文件结构
对于多表聚簇,加速了对特定表连接的处理,但会导致其它类型的查询变慢。
带指针链的多表聚簇文件结构
10.8 数据库缓冲区
在主存储器中保存所有的块是不可能的,需要管理主存储器中用于存储块的可用空间的分配。
缓冲区是主存储器中用于存储磁盘块的拷贝的那一部分。
10.8.1 缓冲区管理器
当数据库系统中的程序需要磁盘上的块时,它向缓冲区管理器发出请求。
缓冲区管理器和操作系统中的虚拟内存管理器是一样的
缓冲区管理器中使用的技术
- 缓冲区替换策略:当缓冲区没有剩余空间时,在新块读入缓冲区之前,必须把一个块从缓冲区移出。多数操作系统使用最近最少使用(LRU) 策略
- 被钉住的块:为了使数据库系统能够从操作系统崩溃中恢复,限制一个块写回磁盘的时间是必要的。不允许写回磁盘的块称为被钉住的块
- 块的强制写出:某些情况下,尽管不需要一个块所占用的缓冲区空间,但必须把这个块写回磁盘。
10.8.2 缓冲区替换策略
最近最少使用-LRU替换策略
与操作系统中的LRU类似,不再赘述
最近最常使用-MRU替换策略
如果必须从缓冲区移出一个块,则MUR策略选择最近最常使用的块(当块被使用时不能被替换)