数据库是以一系列文件的形式存储的。每个文件在逻辑上组织成为记录的一个序列
如何在文件(块)中存储一条记录?
可能是定长or变长
空闲列表的实现:
变长储存方式
1.
分槽页的块头包含:
记录可以在页中移动,来保持它们连续存储
记录相互间没有空闲的空间(若删除记录,需移动记录数据)

➢ 适用于需要对整个文件进行顺序处理的应用
➢ 文件中的记录按搜索码排列
➢ 删除 – 使用指针链
➢ 插入 – 定位插入的位置
➢ 需要不时重组文件

能够很好地处理对
d
e
p
a
r
t
m
e
n
t
⋈
i
n
s
t
r
u
c
t
o
r
department\Join instructor
department⋈instructor的查询以及涉及一个系和相应教师的查询
只查询一个表效果不好,可以添加指针连连接关系记录
数据字典:也称系统目录存储元数据
系统元数据的关系表示

每个文件分成定长的存储单元,称为块。块是存储分配和数据传输的基本单位
数据库系统的一个主要目标就是减少磁盘和存储器之间传输的块数。减少磁盘访问次数的一种方法是在主存储器中保留尽可能多的块
缓冲区:主存储器种用于存储磁盘块的副本的那一部分
缓冲区管理器:负责缓冲区空间分配的子系统
➢ 程序需要磁盘上的块时,可以向缓冲区管理器发出请求
多用最近最少使用策略 (least recently used ,LRU)
当涉及对数据重复扫描的访问模式时,LRU是一个糟糕的策略
如
当通过嵌套循环来对2个关系r和s进行连接操作
for each tuple tr of r do
for each tuple ts of s do
if the tuples tr and ts match …
由查询优化器提供的带有提示的混合替换策略是较好的选择
缓冲区管理器可以使用请求访问某个特定关系的统计信息
数据字典被经常访问
-->数据字典的块保留在主存储器的缓存中
为保证数据可恢复性,缓冲区管理器也支持块的强制写出到磁盘
索引机制用来加速对所需数据的访问
搜索码 – 用于在文件中查找记录的属性或属性集
一个索引文件包含如下形式的记录 (称为索引项)
两种基本类型索引:
索引技术评价指标:
文件中的每个搜索码值有一个索引记录


只为搜索码的某些值建立索引记录
寻找有搜索值K的记录
稀疏稠密对比
稀疏:插入、删除开销小,定位记录较慢
一般折中:为每个块建立一个索引项(块起始搜索码)的稀疏索引

主索引太大无法放入主存,那么访问的开销就很大
将主索引以顺序文件的形式放于磁盘,并为其建立
一个稀疏索引
具有两级或两级以上的索引称为多级索引
对文件进行插入或删除操作后,所有级别的索引都需要更新

我们希望找到某一特定字段(非主索引的搜索码)符合某些条件的所有记录
关系instructor按照ID顺序存储,我们希望找到某一特 殊领域内的所有教师
索引记录指向包含所有指向具有特定搜索键值的实际记录的指针
辅助索引一定为稠密索引
好处与坏处
复合搜索码是指包含不止一个属性的搜索码
✓例如(dept_name, salary)
词典顺序
(
a
1
,
a
2
)
<
(
b
1
,
b
2
)
(a_1,a_2) < (b_1,b_2)
(a1,a2)<(b1,b2)
顺序索引缺点:
B+数索引优势
缺点:额外的插入和删除开销,空间开销
满足如下属性

非叶节点在叶子节点之上形成了一个多级(稀疏)索引。对于带有m个指针(m称之为扇出,fanout)的非叶节点:
如n = 6
B+树形成了一个稀疏索引的层次结构
可以用相对较少的层次来表示大量的搜索码
因此,如果索引文件中有K个搜索键值,则树的高度
(即搜索路径长度)不超过
⌈
𝐥
𝐨
𝐠
𝒏
/
𝟐
(
𝑲
)
⌉
\lceil 𝐥𝐨𝐠 𝒏/𝟐 (𝑲)\rceil
⌈logn/2(K)⌉ ,可以利用B+树进行有效地搜索
可以有效地处理对主文件的插入和删除。因为B+树索引可以在有限时间内(与树的高度成正比关系)进行有效重构
function find(v)
1. C=root
2. while (C is not a leaf node)
1. Let i be least number s.t. V Ki
2. if there is no such number i then
3. Set C = last non-null pointer in C
4. else if (v = C.Ki) Set C = Pi +1
5. else set C = C.Pi //(v < C.Ki )
3. if for some i, Ki = V then return C.Pi
4. else return null /* no record with search-key value v exists. */
范围查询可在给定范围内查找具有搜索键值的所有记
录
findRange(lb, ub):先遍历至find(lb)的叶子节点V,再从V开始往后遍历所有小于等于ub的记录next()函数,一次获取一个匹配的记录典型B+树的节点规模通常与磁盘块的大小相同,通常取值为4KB
因此,n通常取值为100左右(每个索引条目40字节)
类似于B+树,但B树只允许搜索码出现一次,消除了搜索键的冗余存储
非叶节点中的搜索码在B树中没有其他位置可出现,因此,必须为非叶节点中的每个搜索键包含一个额外的指针字段(需指向文件记录)
优点:
缺点:
桶是能存储一条或多条记录的一个存储单元(一个桶就是一个磁盘块)
散列文件组织中,通过使用散列函数直接从搜索码中获得包含该记录的桶
散列函数h是一个从K到B的函数。K表示所有搜索码值的集合,B表示所有桶地址的集合
散列函数用来为获取、插入和删除操作定位记录(不同搜索码记录可能对应同一个桶,桶内需要顺序搜索

可以减少这种情况,但无法消除
溢出桶解决桶溢出问题
溢出链:一个给定桶的所有溢出桶用一个链接列表链接在一起
称为闭散列/闭地址

另一种方法称为开散列, 它的桶集合是固定的,没有溢出链,当一个桶满了后,系统将记录插入到初始桶集合的其他桶中
create index <索引名字> on <关系名字>
直接声明该搜索码是一个候选码。
如果数据库系统支持SQL标准的unique声明,那么这里的
unique特性就是多余的
大多数数据库允许指定索引类型,并声明聚集索引