- 文件特点
主文件
按主关键字
有序,因此可以对一组记录
建立一个 索引项
(非稠密索引) - 索引顺序存取方法 / ISAM:
专门为磁盘存取设计的文件组织方法主文件
按柱面
集中存放,同时建立三级索引
:主索引
、柱面索引
和磁道索引
文件的记录在同一盘组
存放时,应先集中放在一个柱面上,然后再顺序放在相邻的柱面上;对于同一柱面,应按照盘面的顺序来存放。
如下图是存放在一个磁盘组上的ISAM文件: 每个柱面
建立一个磁道索引
,磁道索引
中的每个磁道索引项
由两部分组成:基本索引项
和溢出索引项
。每个索引项
都包括关键字
和指针
两项。关键字
表示该磁道中最末一个记录的关键字(在此为最大关键字
)。指针
指示该柱面上的磁道索引位置。
如下图所示:柱面索引
也是存放在某个柱面
上,若柱面索引较大,占多个磁道时,可以建立柱面索引的索引
,也就是主索引
。- 在ISAM文件上检索记录时,
先从主索引
出发,找到相应的柱面索引
,
再从柱面索引
找到记录所在柱面的磁道索引
,
最后从磁道索引
找到记录所在磁道的第一个记录的位置
,
由此出发在该磁道上进行顺序查找
直到找到为止。 - 每个柱面上还开辟有一个
溢出区
,并且磁道索引项中设有溢出索引项
,这是为了插入记录
所设置的。
ISAM文件中记录是按关键字顺序
存放的,则在插入记录
时需要移动记录
,并将同一磁道上最后一个记录移至溢出区,还要修改磁道索引项
。
每个柱面的基本区
是顺序存储结构
;溢出区
是链表结构
,同一磁道溢出的记录由指针
相链。
该磁道索引的溢出索引项
中的关键字
指示该磁道溢出的记录的最大关键字
,指针指示在溢出区中的第一个记录。 - 举例:
如下图a为插入前某一柱面上的状态 - 如下图b为插入 R65时,将第二道中关键字大于65的记录顺次后移,使 R90 溢出至溢出区的情况
- 如下图c为插入 R65 之后的状态,此时2道的基本索引项的关键字改为80,且溢出索引项的关键字改为90,其指针指向第4道第一个记录即 R90
- 如下图d是相继插入 R95 和 R83 后的状态,R95 插入在第3道的第一个记录的位置而使 R145 溢出。而由于 80 < 83 < 90,则 R83 被直接插入到溢出区,作为第二道在溢出区的第一个记录,并将它的指针指向 R90 的位置,同时修改第二道索引的溢出索引项的指针指向 R83。
- 溢出区的三种设置方法
1、集中存放
:整个文件设一个大的单一的溢出区
2、分散存放
:每个柱面设一个溢出区(上图12.8中就是使用此法)
3、集中与分散相结合
:溢出时记录先移至每个柱面各自的溢出区,待满之后再使用公共溢出区 - ISAM文件的删除操作
只需找到待删除的记录
,再起存储位置上作删除标记
即可,不需要移动记录或改变指针,但在经过多次的增删后,文件的结构可能变得很不合理。可能会有大量的记录进入溢出区,而基本区中又浪费很多空间,需要周期地整理 ISAM 文件,填满基本区而空出溢出区。 - ISAM文件中柱面索引的位置
通常磁道索引
放在每个柱面的第一道上
;
柱面索引不应该放在文件的第一个柱面上;每一次检索都需要先查找柱面索引,则磁头需在各柱面间来回移动,希望磁头移动距离的平均值
最小。
因此柱面索引
应放在数据文件的中间位置的柱面上
。