关于第一周数据库的总结(一)

1.物理存储介质概述

  1. 高速缓冲存储器(cache):高速缓冲存储器事最快最昂贵的存储介质,很小,一般由计算机硬件系统来管理,在数据库中一般不考虑它的存储管理,但是在设计查询处理的数据结构和算法的时候,也会考虑到它。

  2. 主存储器(main memory):用于存放可以处理的数据的存储介质。可以包含几个G的数据(个人电脑),甚至在大型服务器上有几百个G,但是对于存储整个数据库还是太小。发生电源故障或者系统崩溃的时候主存的内容通常会丢失。

  3. 快闪存储器(flash memory):不同于主存的是,快闪存储器在电源关闭或者故障的时候数据可以保存下来,比主存便宜。快闪还广泛的应用于“USB盘”中存储数据,在存储中等量的数据时,快闪也被用于替代磁盘存储器,被叫做固态驱动器。在服务器系统中,也经常用快闪存储器来提高性能,因为有比磁盘更快的速度和比主存更大的存储容量(既定价格时)。

  4. 磁盘存储器(magnetic-disk storage):用于长期联机数据存储的主要介质就是磁盘。通常整个数据库都存储在磁盘上。当要访问数据时,系统必须将数据从磁盘移到主存上,完成一定的操作之后,修改后的数据再写回磁盘。磁盘存储器不会因为系统故障或者崩溃而丢失数据,因为它本身就会发生故障 ,不过概率比较小就是了。

  5. 光学存储器(optical storage): 最流行的是光盘,700mb左右,播放80分钟。还有一种是数字视频光盘,就是常说的DVD。

  6. 磁带存储器(tape storage):主要用于备份或归档数据,比磁盘便宜得多,但也慢很多,因为磁盘是从头顺序访问,磁盘是直接访问存储器,可以从任何位置读取数据。


高速缓冲存储器——主存储器——快闪存储器——磁盘——光盘——磁带

这个顺序速度从左到右越来越慢也越来越便宜,从主存往左的存储器都是易失性存储(volatile storage),在设备断电后将丢失所有内容。主存往下的全部是非易失性存储,为了保护数据我们必须将数据写到非易失性存储中去。

最快的存储介质(例如主存和cache)称为基本存储(primary storage)。层次结构中基本存储介质的下一层存储称为辅助存储(secondary storage)或联机存储(online storage)(例如磁盘)。层次最低的介质(例如磁带和自动光盘机)称为三级存储(tertiary storage)或者脱机存储(offline storage)。

这里写图片描述

需要注意的地方是:

  1. 扇区是磁盘读出和写入信息的最小单位,外侧的磁道比内侧磁道含有更多的扇区。

  2. 存储区域网(SAN):存储区域网能够实现对磁盘的远程访问,意味着磁盘可以并行运行一个应用程序的不同部分的多台计算机所共享。

2. 磁盘性能的度量:

主要的指标是容量,访问时间,数据传输率和可靠性。

访问时间:从发出读写请求道数据开始传输之间的时间。

    1. 首先是磁盘臂定位,定位的时间称为**寻道时间**,平均寻道时间大约是最长寻道时间的1/2.。

    2. 然后是等待访问的扇区出现在读写头下所花费的时间称为**旋转等待时间**。平均情况下,磁盘的平均旋转等待
    时间是磁盘旋转一周时间的1/2。

    3. 访问时间就是寻道时间和旋转等待时间的总和,范围大致在8-20毫秒之间。当待访问数据来到读写头的下方,数
    据传输就开始了

数据传输率:是从磁盘获得数据或者向磁盘存储数据的速率。对于磁盘内侧磁道,数据传输率远低于最大传输率。例如100MB的最大传输率,内侧磁道大概为每秒30MB

平均故障时间(是磁盘可靠性的标准):是我们可以期望系统无故障连续运行的时间量。现代磁盘的平均故障时间在57年到136年之间,然而并不意味着磁盘最高预期可以工作136年,大多数磁盘预期可以工作5年左右,然后其故障发生率会显著提高。

3.磁盘块范文的优化

磁盘I/O请求是由FS和大多数操作系统具有的虚拟内存管理器产生的。每个请求指定的是相应要访问的磁盘地址。这个地址是由块号的形式提供的。一个(block)就是一个逻辑单元。

:是一个逻辑单元,包含固定数目的连续扇区,大小在512字节到几KB之间。数据在磁盘和主存之间以块为单位传输,术语常用来形容块。

顺序访问(sequential access):连续的请求会请求相同的磁道或者是相邻的磁道上连续的块,在顺序访问时,只有第一块需要磁盘寻道,之后就不用了。

随机访问(random access):相继的请求会请求那些随机位于磁盘上的块,并且每一个请求都需要一次磁盘寻道,因此随机访问模式明显要比顺序访问模式的数据传输效率低。

为了提高访问块的速度,产生了很多技术:

    1.缓冲:从磁盘读取的块暂时存储在内存缓冲区中,由操作系统和数据库系统共同运作

    2.预读:当一个磁盘被访问时,相同磁道的连续块也被读入内存缓冲区,即使当前没有这些块的请求,在顺序访问的
    情况下,当它们被请求时,这种预读可以保证很多块已经在内存中。但是这对于随机访问并不是很有用

    3.调度:如果需要的块在不同的柱面上,按照使磁盘臂移动最短距离的顺序发出访问块请求是非常有利的。通常使用
    的是**电梯算法**,由内向外移动,当有请求的时候就在那条磁道上停下来,然后继续向外移动,等到最外层时再反
    过来向内移动。

    4.文件组织(file organization):按照与预期访问方式最接近的方式来组织磁盘上的块。例如,如果预计一个
    文件会按照顺序访问,那么理想情况下,可以把所有块存储在相邻的柱面上。但是在决策上时,需要考虑到分配多少
    柱面,并且当插入和删除的时候,重新组织文件需要昂贵的代价。

    5.非易失性写缓冲区(NV-RAM)

    6.日志磁盘(log disk)

4.独立磁盘冗余阵列(RAID)

在一个系统中使用大量的磁盘大大加快了读写速率,因为并发访问的话很多读和写的操作可以并发进行。并且提高了数据存储的可靠性——在多张磁盘中存储信息,就算一个磁盘故障造成数据丢失也没关系。

    1.通过冗余提高可靠性:
    · 存储正常情况下不需要的额外信息,但这些信息可在发生磁盘故障的时候用于重建丢失的信息。
    · 实现冗余的方法(最昂贵也最简单):镜像。即一张逻辑磁盘由两张物理磁盘构成。

    2.通过并发提高性能;
    ·首先单一磁盘的传输速率是一定的,然后两张一起读写的话就是两倍,以此类推。
    ·数据拆分:将每个字节按比特分开,存储到多个磁盘上。
    ·块级拆分:将块拆分到多张磁盘。

5.文件组织(file organization):

一个数据库被映射到多个不同的文件,这些文件由底层的操作系统来维护。并永久的保存在磁盘上。一个文件在逻辑上组织成为记录的一个序列,这些记录映射到磁盘块上。

每个文件分成定长的存储单元,叫做块(对!又是我)。块是存储分配和数据传输的基本单元。大多数的数据库默认使用4-8kb大小的块,但是也是可以设置成更大的。

一个块可能包括很多条记录。一个块所包含的确切的记录集合是由使用的物理数据组织形式所决定的。一般来说没有记录比块要大的,但是也有例外,比如说图片的存储。

并且每一条记录都是完整的包含在单个块中,这个限制简化并加速了数据项的访问。

1.定长记录:

1)例如这种属性,id varchar(20),比如student数据库中只有这一个属性,那么就可以说,一个student记录占20个字节
而不是可变的字节。于是用简单地方法一条student记录占20个字节,接下来的20个字节存储第二条,以此类推。但是这也造
成了两个问题:
    ·除非块的大小恰好是20,不然一些记录就会跨界。这样的话读写这样一条记录需要两次块的访问
    ·删除一条记录十分的困难
为了避免以上问题,于是在一个块中只分配它能完整容纳下的最大的记录数,每个块剩余的字节就不使用了。

2)当文件被删除时,可以把紧随着的记录向前移动,这样就是被删除记录之后的每一条记录都做了移动,比较麻烦,比较简单
一点的就是把文件最后一条移动到被删除记录所占据的空间上。

3)然而移动记录占据被删除记录的空间效果不太理想,因为需要额外的块访问操作。所以这个时候把这个释放的空间先空着
然后等待插入。但是操作需要找到这个空间,光是一个标记是远远不够的,这个时候就需要引入额外的结构。

4)为了解决上述问题,在文件开始处,我们分配一定数量的字节作为文件头,文件头包含了有关文件的各种信息。到目前为
止,需要在文件头中存储的只有内容被删除的第一个记录的地址,然后用这个记录的地址来存储第二个可用记录的地址。也可
以直观的把这些地址看作指针,因为它指向的是一个记录的位置于是被删除的记录形成了一条链表,称为空闲列表。

5)在插入一条新纪录时,我们使用文件头所指向的记录(就是被删除的记录的地址)然后再把指针指向下一条可以使用的记录
如果没有可用的空间就默认把新纪录添加到文件末尾。

6)对定长文件的插入和删除是比较简单的,因为删除的和插入的空间是一样的。如果允许文件包含不同的长度的记录,那么这
样的匹配就不成立了,插入的记录可能无法放入,或者只能占这个空间的一部分。

2.变长记录

变长记录在数据库中的存储方式:

  1. 多种记录类型在一个文件中存储

  2. 允许一个或多个字段是变长的记录类型

  3. 允许可重复的字段类型,例如数组或多重集合

变长记录面临着两个问题:一个是如何描述一条记录,一个是如果存储一条变长记录。

而一条变长属性的记录通常包括两个部分:

  1. 初始部分是定长属性,接下来是变长属性,定长属性(如数字值,日期)会先分配所需的字节。

  2. 接下来是变长属性(如varchar),在记录的初始部分中表示为一个对值,即(偏移量,长度),偏移量就是数据开始的位置,长度表示的是变长属性字节的长度。在第四个 salary 属性上,因为它是一个大小固定的数值,所以把它放在前面的初始位置上。

  3. 中间的那个0000,就是空位图(null bitmap),是用来表示记录中哪个属性是空值,例如,如果 salary 属性是空值,那么存储在12-19字节的salary值将会被忽略(还有一个字节用来存储空位图)。

这里写图片描述

接下来要处理的是在块中存储变长记录的问题。分槽的页结构(slotted-page structure)一般用于在块中组织记录。

这里写图片描述

每一个块的块头包含以下信息:

    1.块头中记录条目的个数(条目不代表记录,相当于一个包裹一个记录的盒子,存的是它的地址)
    2.块中空闲空间的末尾处
    3.一个由包含记录位置和大小的记录条目组成的数组

实际记录从块的尾部开始排列(注意是从后往前),块中空闲空间是连续的,如果插入一条记录,子啊空闲空间的尾部会给这条记录分配空间,并且将包含这条记录大小和位置的条目添加到块头中。

如果一条记录被删除,它所占用的空间就会被释放,并且它的条目也会被设置成删除状态(比如这条记录的大小被设置为1),然后被删除的记录之前的那些记录会被移动,这样由删除而产生的空闲空间就会被重用,并且空闲空间仍然存在于块头数组的最后一个条目和第一条记录之间,然后块头中的空闲空间末尾指针也要做适当修改。

分槽的页结构要求没有指针直接指向记录,指针指向的其实是记录实际位置的条目

6.文件中记录的组织

    1.堆文件组织(heap file organization):只要文件有空间存放这条记录,这条记录可以放在文件中的任何地方,记
    录是没有顺序的。

    2.顺序文件组织(squential file organization):记录根据其“搜索码”的值顺序存储

    3.散列文件组织(hashing file organization):在每条记录的某些属性上计算一个散列函数。散列函数的结果确定了
    记录应放在文件的哪个块中。

通常来说,每个关系的记录(关系就是记录的集合)用一个单独的文件存储。但是在多表聚簇文件组织(multitable clustering file organization)中,几个不同关系的记录在同一个文件中,然后不同关系的相关记录存储在相同的块中,于是一个I/O操作就可以从所有关系中取到相关的记录。例如,两个关系做连接运算时相匹配的记录被认为是相关的。

  1. 顺序文件组织:

    顺序文件(sequential file)是为了高效处理按某个搜索码的顺序排序而设计的。搜索码(search key)是任何一个属性或者属性的集合,为了快速的按照搜索码的顺序来获取记录,我们通过指针把记录链接起来,每一条记录的指针指向按搜索码顺序的下一条记录。为了减少块访问数,一般在物理上按照搜索码顺序或者尽可能按照搜索码顺序存储记录。

    这里写图片描述

    但是顺序文件组织在插入和删除记录的时候维护记录的物理顺序是很难,所以每一次的单独插入或者删除的代价都很高。也可以按照指针链表来管理删除,首先在文件中定位在你现在要插入的这条记录之前的那条记录的位置,然后如果这条记录所在的块中,有空闲记录(即删除后留下的空间),那么久在这里插入新的记录,不然就讲新纪录插入到一个溢出块中。然而这种方法的话,会破坏原来顺序组织文件的物理顺序,造成查询的时候效率低下,这个时候就需要文件的重组,让它再一次在物理上按照顺序存放,然而代价也很大。

  2. 多表聚簇文件组织:

    很多关系数据库系统将每个关系存储在单独的文件中,以便它们可以利用操作系统所提供的文件系统的所有好处。通常,关系的元组可以表示成定长记录,所以,关系可以映射到一个简单的文件结构上。关系数据库系统的这种简单实现非常适合于廉价的数据库实现。

    多表聚簇文件组织就是一种在每一个块中存储两个或者更多关系的相关文件结构。这样的文件组织允许我们使用一次块的度去操作来满足连接条件的记录。这样做的好处是对于特定的连接的处理会变快,但是导致其他类型的处理变慢。
    7.索引与散列

索引就相当于是新华字典前面的那个拼音表,你通过那个搜索码找到字,然后通过那个索引的映射到相关的值,这个就是索引。是为了能够快速访问到文件中记录的一种方法。

有两种基本的索引类型:

  1. 顺序索引:基于值的顺序排序。
  2. 散列索引:将值平均分布到若干散列桶中,一个值所属的散列桶是由一个函数决定的,该函数称为散列函数。

我们将考虑用于顺序索引和散列索引的几种技术,每一种技术必须基于下面的这些因素:

  1. 访问类型(access type):能有效支持的访问类型。(就是能找到具体的属性值的记录或者某个范围的记录)

  2. 访问时间(access time):在查询中使用该技术找到一个特定数据项或者数据项集合所需要的时间

  3. 插入时间(insertion time):插入一个新数据所需要的时间(包括插入的时间和更新索引所需要的时间)

  4. 删除时间(deletion time):删除一个数据项所需要的时间(包括删除的时间和更新索引结构所需要的时间)

  5. 空间开销(space overhead):索引结构所占用的额外存储空间

在一个文件中通常需要多个索引,用于在文件中查找记录的属性或者属性集的叫做搜索码,这个搜索码和主码,候选码以及超码是不同的,一般上来说,如果一个文件上有多个索引,那么它就有多个搜索码。

顺序索引

顺序索引是按照顺序存储搜索码的值,然后再把每个搜索码和包含该搜索码的记录关联起来。

被索引文件中的记录本身也可以按照某种排序顺序存储,一个文件可以有多个索引,分别基于不同的搜索码。

主索引(或聚集索引):包含记录的文件按照某个搜索码指定的顺序排序,主索引的搜索码经常是主码,但是并非必须如此。

辅助索引(或非聚集索引):搜索码指定的顺序与文件中记录的物理顺序不同的索引

稠密索引和稀疏索引

索引项(index entry)或索引记录(index record)由一个搜索码值和指向具有搜索码值的一条或多条记录的指针构成。

可以使用的顺序索引分为两类:

1.稠密索引(dense index):在稠密索引中,文件中的每个搜索码值都有一个索引项,索引项包括搜索码值以及指向具有该搜
索码值的第一条数据记录的指针。具有相同搜索码值的其余记录顺序的存储在第一条记录之后。
2.稀疏索引(sparse index):在稀疏索引中,只为某些值建立索引项并且只有当索引是聚集索引的时候才可以使用稀疏索引,
索引的方法是先找到其最大搜索码值小于或等于所查找记录的搜索码值的索引项,然后再一条条的往下查。

稀疏索引就类似于:一本印刷好的字典,每页页眉都顺序地列出了该页按字母顺序出现的第一个单词,字典中每页顶部的单词就共同构成了稀疏索引。

这里写图片描述

稠密索引只需要按照搜索码值来寻找,所以通常可以比系数索引更快的定位一条记录,然而系数索引占空间小,并且插入和删除时所需要的维护开销也小。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值