前言
本章对应数据库系统lecture7-1 storage and file structure课件的部分内容。
一、介绍存储介质(磁盘为主)
代表性的存储介质有:
①高速缓存
②主存
③flash Memory(USB driver/手机的存储等)
④磁盘
⑤光学存储(CD/DVD)
⑥磁带。
按照存取速度和成本,可以组织成层次结构,如图示意。
自上而下,存储速度越来越小,成本越来越小。
大多数计算机系统存在多种数据存储类型,可以根据访问数据的速度配置不同的存储介质。
根据存储介质的访问速度、成本和可靠性对存储介质进行分类。
存储介质的另外一种分类:易失性和非易失性。
①易失性存储介质:依赖于电力支持,没电了,其中存储的数据就丢失了,例如主存 、RAM。
②非易失性存储介质:存储的数据持久存储,不受电力影响:例如磁盘、磁带、flash memory。
1.介质分类
1.1 cashe(缓存)
①最快也是最贵的存储介质
②是易失性的
③OS负责管理
1.2 main memory(主存)
①高访问速度——大概10-100纳秒
②一般而言不用做存储整个数据库系统(本身容量相对较小,或者价格太贵)
③目前广泛使用的容量高达几千兆字节
④目前的趋势:容量增加,每字节的成本稳步快速下降(摩尔定律)
⑤是易失性的,也就是说,当电源切断或者发生电脑崩溃的时候,主存的数据往往会丢失
1.3 flash memory(闪存,快擦写存储器)
①是非易失性的
②数据只能在一个位置写入一次,但该位置可以擦除并再次写入
只能支持有限数量(10K–1M)的写入/擦除周期。
必须对整个内存库进行内存擦除
③读取速度大致和主存一样快,但写入速度慢(几微秒),擦除速度也较慢
⑤每单位存储的成本与主存大致相似
⑥广泛应用于嵌入式设备,如数码相机、手机和USB钥匙
1.4 Magnetic-disk(磁盘)
①磁盘是主要的用于持久存储数据的介质,通常存储整个数据库
为了能够访问数据,系统必须将数据从磁盘移到主存中,完成相应的数据处理后再讲结果写回磁盘
②读写磁盘中的数据是随机读写,相比磁带的顺序读写,读写性能高了很多
③磁盘中的数据不会因为系统故障或系统崩溃丢失数据,但磁盘设备本身有发生故障的可能性,导致数据呗损坏。这个概率比发生系统崩溃的概率小很多
④访问速度比主内存慢得多
⑤是非易失性的
1.5 Optical storage(光存储)
①使用激光从旋转盘光学读取非易失性数据
②读写比磁盘慢
③Juke-box系统:具有大量可移动磁盘、少数驱动器和一种自动加载/卸载磁盘的机制,可用于存储大量数据(光盘塔)
1.6 Tape storage(磁带)
①非易失性,主要用于备份(从磁盘故障中恢复)和存档数据
②顺序存取(顺序访问),只能从头顺序访问数据——比磁盘慢得多,
③非常高的容量(提供40到300 GB磁带)
2.磁盘
2.1 磁盘物理结构
磁盘的物理构造结构有磁盘片、读写头、磁盘臂(机械臂)、磁道、扇区、柱面等概念
①磁盘的每一个盘片(platter)是扁平的圆盘,信息记录在上面。
②当磁盘被使用时,驱动马达使磁盘高速旋转,盘片的表面逻辑上被划分为过个同心圆,称作磁道,磁道又被划分为扇区,扇区从磁盘读写数据的最小单位
==>磁盘——磁道——扇区
③有一个读写头位于每个盘片的表面上方,通过翻转磁性物质磁化的方向,将信息存储到扇区中。
④所有读写头安装在一个称为磁盘臂的的单独装置上,是机械装置,并且一起移动。
⑤所有盘片的第i个磁道合在一起称为第i个柱面。
⑥为了增大记录的密度,读写头尽可能第靠近磁盘盘面的表面。读写头损坏是磁盘常见的故障,读写头一般浮于盘片表面之上几微米,如果接触表面会刮坏磁盘上的存储介质,破坏数据。
2.2 磁盘物理组成: 控制器(Controller)
是作为计算机系统和实际磁盘驱动器硬件之间的接口,在磁盘驱动单元内部实现,接受高层的读写扇区的命令.
接收到命令后,控制器驱动磁盘开始如下的动作:
①移动机械臂到正确的磁道
②读写数据
③为所写的每个扇区附加校验信息。
2.3 磁盘的容量计算
磁盘的容量计算:
磁盘的总容量=记录盘面数*每记录盘面的磁道数*每磁道的盘块数*每盘块的字节数
2.4 LBA(logical block address)
实际应用中,我们需要将物理结果与逻辑结构进行映射。
物理上,当我们需要确定数据所在的位置时需要知道柱面(那个磁道上)、读写头(哪个盘面上)和扇区(数据访问的基本单位),因此物理地址为CHS。
逻辑块编址技术采用线性编址方式简化了访问数据的物理数据块,将CHS变换为连续的“块”号,计算机系统只需要知道块号即可。
逻辑块与扇区一一对应,编号按照盘片顺序依次排列,每个盘片上下两面,依次排序。
如图例子示意:
一共4个盘片,每个盘片上下两面,一共2×4=8个扇区,所以分为block0-block7
下面的从block8-block15,每个面8个块(8个扇区)。
第二个盘片从block15开始编号,一共 8 x 8 x 4 = 256 blocks
2.5 磁盘的性能度量
磁盘性能影响数据访问的性能。
磁盘的性能度量有四个指标:磁盘的容量、访问时间、数据传输速度和可靠性
①访问时间是从发出读或写请求到数据开始传输之间的时间,访问时间=寻道时间+旋转等待时间
对于降低I/O代价非常关键——减少寻道时间和旋转延迟时间
寻道时间:磁头定位花费的时间,定位某磁道。
旋转等待时间:被读写的扇区出现在读写头的位置花费的时间
②数据传输率:从磁盘获得数据或向磁盘存储数据的速度,通常为25-100MB/秒,接口不同,传输率有差异。
③磁盘可靠性用平均故障时间MTTF来评估:期望磁盘无故障连续运行的时间,一般3-5年。
3.RAID(磁盘阵列)
通常称作磁盘冗余阵列,简称磁盘阵列。
这项技术的产生来源于数据量不断增长,需要大量磁盘来存储数据。考虑:
①造一个更大的磁盘来存储数据
②多个容量相对小一些的磁盘按照某种规则组成可靠性高的磁盘组。
RAID是一项数据组织技术,用多个较小且廉价的磁盘构成的磁盘系统来代替大而昂贵的磁盘系统。
RAID两项重要的技术:冗余(Redundancy)和并行(Parallelism)。
冗余(Redundancy):
通过数据冗余存储提高可靠性,如果一个磁盘出现故障,可以从其他磁盘恢复数据。
最直接的方法是镜像(Mirroring)的方法,即复制一张磁盘,全盘复制,很昂贵。每一次写分别在两张磁盘上各写一次,如果一张磁盘故障,另一张仍然可访问。
并行(Parallelism):通过并行技术提高访问性能,并行访问多个磁盘。
3.1 Striping(条带化)的并行访问
RAID通过对多张磁盘并行访问提高访问性能,通过将数据拆分至多个磁盘上,同时利用多张磁盘的读取接口提高数据传输效率。
在多个磁盘上Striping(条带化)数据访问来改善传输率。
常用拆分数据的方式:块级别的条带化。假设n个磁盘做RAID,那么文件的i个数据块存储放在(i mod n) + 1磁盘上,如果需要访问的数据分布在不同的磁盘上,这时并行访问这些磁盘。
假设4块磁盘做RAID,左边的图表示4块磁盘以及每一个磁盘的磁盘空间
图中最小的格子表示一个扇区sector的存储空间,
一个block=4个sector,strip(有些文献称作segment)=2个blocks,8个sector。
右侧的图表示存储数据时以segment(stripe)为单位。
一个strip是4块磁盘地址空间统一管理,以对齐的4个segment作为一个strip。
注意!磁盘上只有扇区结构,Strip不是一个实际存在的结构。
3.2 RAID Levels
通过条带与校验位结合,在成本和性能之间权衡,以较低成本提供数据冗余的方案。
RAID 0:块级拆分但没有冗余。在块级做条带,没有冗余。即多个磁盘只作条带话来存储数据,不冗余存储数据。
RAID 1:块级拆分的镜像磁盘。磁盘通过块条带化做镜像,冗余存储数据.
RAID 5:采用了块级拆分且校验信息分布式存储,即数据和其他的数据的校验信息可以存储在同一个磁盘上,但是该数据自己的校验信息不能和自己存储在同一块磁盘上,不需要单独的磁盘来存储校验信息。
RAID level选择从以下几个方面考虑:
(1)成本
(2)性能
(3)磁盘故障时的性能
(4)磁盘故障后数据重建的性能
RAID 0用于安全性不是很高但对数据读性能要求高的高性能应用。RAID2~4几乎不用。
常见的是RAID 1(有些厂商称作1+0)和RAID5之间挑选。
二、文件组织,记录组织和存储访问
1.文件组织
前言:一个数据库有多个表,被映射到多个不同的文件中,这些文件由底层的文件系统来负责维护,持久存储在磁盘上。
1.1 定长记录(fixed-length records)
当确定了块的大小,一个记录的大小也确定了的话,就可以确定一个块存储的记录数。
对于一个数据库,采用如下的定义:
type instructor = record
ID varchar (5);
name varchar(20);
dept name varchar (20);
salary numeric (8,2);
end
根据上面sql语句记录的定义对于每条记录都用最大的长度来分配存储空间,这时就是定长记录。
记录的size可以计算得到(5+20+20+8)一共53个byte。在一个数据块的存储空间里,开始的53个字节(1-52)存储第一个记录,接下来的53个字节存储第二个记录,接着依次存储一批记录。。。。。。
这样的数据组织方式简单,访问数据也简单。
比如查询:如果数据排序了,就二分查找;如果没排序,顺序scan。
但删除记录会有问题,这时删除记录得到的空闲空间要由其他记录来填充,或者加删除标记,忽略这个记录。
1.2 变长记录(variable-length records)
实现变长记录组织有不同的技术,都必须解决以下两个问题:
(1)如何描述一个记录使得单个属性可以容易地抽取出来(可以容易地访问到具体的属性)
(2)如何在一个数据块中存储变长记录使得块中的记录很容易地抽取(可以很容易地访问某个具体的记录)
表示一个变长记录包括两个部分:
(1)开始部分是定长属性的数据,如日期、数值型、定长字符串。按照这些类型所需的字节数存储。如记录的属性类型为numeric(8,2),就分配8个字节。
(2)第二部分是变长属性的数据,如变长字符串,则在记录的开始部分存储表示 (offset, length)对, 其中offset表示记录中该属性的数据开始的位置,length表示某记录变长属性的实际字节数。例如 name varchar(20),有些人的名字是8个字节,有些人的名字是20个字节。
在记录的开始定长属性部分之后,这些变长属性值连续存储。
对于instructor记录:
type instructor = record
ID varchar (5);
name varchar(20);
dept name varchar (20);
salary numeric (8,2);
end
采用变长记录存储的方式组织数据,可以定义:
——ID,name和dept_name是变长属性
——salary是数值型,是定长属性。
假设offset和length的数值存储分别用2个字节来存储,占用4个字节。
Salary占用8个字节的空间,每个字符串的字节数与它的字符数相同(实际几个字符就几个字节,比如Kim占3个字节,Einstan占7个字节),另外有一个字节(实际只用4位,称作null bitmap)用来说明一个记录某个属性是否存在null值。
如下图:
其中Byte[0-3]用来存储ID的起始字节和长度;
Byte[4-7]用来存储name的起始字节和长度;
Byte[8-11]用来存储dept_name的起始字节和长度;
Byte[12-19]用来存储salary的数据——定长记录;
Byte[20]用做null bitmap;
Byte[21-25]用来存储ID的数据,对应(21,5)
Byte[26-35]用来存储name的数据,对应(26,10)
Byte[36-45]用来存储ID的数据,对应(36,10)
Slotted-Page Structure——多变长记录存储方法
在一个数据库块中,多个变长记录如何组织:Slotted-Page Structure是常用的方法。
具体结构如下:
每个块的头部记录以下信息:
①记录个数
②块的的free space的末端地址
③每个记录的位置和大小。
这是一个数据块中的多个变长记录的组织。
①最左边是块的头,第一个slot记录了记录的个数和块的free space的末端地址;
②接下来的slot分别记录了每个记录的位置和size。
③Free space之后是每一个具体的记录。
插入删除操作:
当插入一条记录时,从空闲空间(free space) 的 末端开始,插入数据,然后在块的头部记录新插入的记录的开始位置和大小。
当删除记录时,释放记录的存储空间,修改块头部该记录的信息,如将大小修改为-1,然后左边的记录向右移动填补空间,使得左右的记录仍然紧连,同时修改块头开始的记录个数以及free space的末端地址。
2.记录组织
在文件中组织数据有几种方式:
(1)堆文件组织:记录可以放置在文件中任意的空闲存储空间中,数据记录无序存放。
(2)顺序文件组织:记录按照一个属性的值有序存放(search key是查询时关注的属性)。
(3)hash文件:根据一个hash函数对每个记录的一些属性值进行计算,得到的值对应到数据记录应该存储的数据块。
2.1 顺序文件组织—Sequential File Organization
顺序文件组织是为了高效处理按照某个属性值的顺序排序的记录,例如依次处理按照ID排序好序的记录,排序的那个属性可以称作search key。
search key不一定是primary key或superkey。
为了快速按照search key的顺序获取记录,记录用指针连接起来,每条记录的指针按照search key的顺序指向下一个纪录。
为了减少顺序文件处理的块访问数量,在物理上(块空间中)按照search key的顺序或者尽可能接近search key的顺序存储记录。
当记录采用顺序文件组织方式时,在删除数据和增加数据是维护顺序很困难。
删除数据:使用指针链表形式,修改链表指针完成。
插入数据:首先定位插入记录的位置上(保持顺序),如果所在的数据块有空闲空间(之前删除记录留下来的),就插入新的记录;否则在新的溢出块(overflow block)中插入新的记录。
如上图,新插入的数据没有空闲空间分配,只能进入溢出块,溢出块里记录的物理顺序和按照search key的顺序可能完全不一样,顺序处理数据的效率将非常低。
2.2 Multitable Clustering File Organization
大多数数据库系统将每个关系的记录存储在单独的文件中,关系记录为定长记录,这时关系可以映射到一个简单的文件结构上。
这种简单的实现方式适用于小型数据管理应用。当数据规模增大时,当访问数据时,需要访问多个数据块,数据访问性能就降低了。
很多大型数据库系统在文件管理方面不直接依赖操作系统的文件系统,而是有操作系统分配给数据库一个大的系统文件,数据库系统把所有的关系存储在这个文件中,自己自己来管理。
这是具有指针链的多表聚集文件结构,用指针将department的所有记录链接起来。
如果为这个natural join设计一个高效的数据组织结构,每个系的instructor记录存储在具有相应dept_name的department的附近,这样当读取department的一个记录时,包含这个记录的整个块被读入到内存。由于相应的instructor存储在靠近department记录的附近,所以包含department记录的块包含查询需要的instructor的记录。
这样做natural join时访问的数据块少很多。I/O代价较低。