计算机系统存储体系
数据库存储与检索问题
两个基本问题?
- 如何高效的存储?-- 数据组织和索引
- 如何快速的检索?-- 查询实现与查询优化
数据库组织基础-- 存储体系
操作系统如何管理磁盘和数据
操作系统对数据组织:FAT-目录(文件夹)-磁盘块/簇
FAT(文件分配表-File Allocation Table)
一个磁盘块/簇可以是一个扇区或者多个扇区
缓冲区的管理
- 一条记录的地址 = 存储单元地址 = 内存地址 = 页面 : 页面偏移量
- 页面 = 块
- 内存页面的分配:申请内存,操作系统进行分配
- 内存页面置换:内存中要访问的数据不存在,需要从磁盘中置换时,操作系统中有学过交换策略如LRU
磁盘的结构和特性
磁盘以及磁盘容量
盘面:磁道:扇区
磁盘的读写单位:Sector -> 簇/块Block:连续的扇区
磁盘数据访问
物理存取算法考虑关键:
- 降低I/O次数
- 降低排队等待时间
- 降低寻道/旋转延迟时间
DBMS数据存储与查询实现的基本思想
数据存储的映射示意
首先数据库逻辑层中数据存储是表和表记录呈现,而数据库物理层的数据存储是以磁盘块的形式,磁盘块中存放记录数据,表记录数据是通过索引和磁盘块进行映射的,索引的每一项都有指向一个磁盘块的指针,而 操作系统中的FAT表,每一个文件都对应一块磁盘块,当要添加记录的时候,利用操作系统的FAT表先占用磁盘块,接着根据索引将记录写到磁盘块中。
当要查询记录时,根据索引找到对应的磁盘块,然后将磁盘块加载到内存(数据库缓冲区DB Buffer)当中,数据库缓冲区和磁盘存在存在映射关系,由内存页面-磁盘块表来管理,而记录和数据库缓冲区存在映射关系,由记录-指针表来管理,当数据库缓冲区中满了,操作系统会根据替换磁盘块。
数据存储与查询实现的基本示意框架
数据库-表所占磁盘分配方法
- 连续存储:数据块分配在连续的磁盘块上(缺点:当后续扩展(插入新纪录)困难)
- 链接分配:数据库中包含下一个数据库的指针(访问速度慢)
- 按簇分配:就是若干个连续的磁盘块,簇之间按指针连接
- 索引分配:索引块中存放指向实际数据块的指针
文件的组织方法
-
无序组织:无序记录文件(堆文件)
记录可以存储在任意的空间,磁盘上上记录存储是无序的,跟新的效率高,但是检索的效率可能很低。对于数据插入又两种选择,一种是插入到文件的尾部(也就是数据最后面),一种是插入到已经被删除记录的位置,前提是记录空间大小要不大于被删除记录空间大小。
对于记录频繁更新会造成空间浪费,所以需要有周期性的数据库重组,也就是回收那些被删除记录的空间。
-
有序组织:有序记录文件
插入的记录能够按照某个属性值有序的存储,这样的话检索效率可能高。
用来存储排序的属性通常被称为排序字段,通常排序字段使用关系中的主码(表中主键),所以又称排序码。有序文件的更新效率可能很低,因为在插入的时候,需要移动其他记录,因此,采取的方法是保存一个临时的无序文件(溢出文件),用来存放插入的记录,目的是保持主文件依然是有序的,但是如果溢出文件的记录过多时,有序文件的检索效率高的特点就消失了,所以也需要周期性的数据库重组。
-
散列文件
可以把记录按照某属性或者属性值,根据一个散列函数计算应该存放的位置:桶。检索和更新的效率都有一定提高。 散列字段通常是关系中的主码,所以又称散列码。散列文件存在不同记录可能放在同一个桶中,此时需要在桶内顺序检索出某一记录。
-
聚簇文件
将具有相同的或者相似的属性值记录存放在连续的磁盘中
多表聚簇:将若干个相关的表存储在一个文件中可以提高多表情况下的查询速度。