有结构文件:顺序文件、索引文件和索引顺序文件
1. 顺序文件
核心概念
顺序文件是最简单、最传统的文件组织方式。其中的记录按照某种顺序连续地存储在存储介质(如硬盘、磁带)上。这个顺序通常是基于一个字段,即主键。
- 物理顺序即逻辑顺序:记录在磁盘上的物理存储顺序与它们基于关键字的逻辑顺序一致。
- 定长 vs. 变长记录:记录可以是定长的(每条记录占用相同字节),也可以是变长的(如包含可变长字符串)。定长记录处理起来更简单。
组织方式
- 严格顺序:记录严格按照主键值升序或降序排列。
- 堆文件:记录完全无序,按照到达的时间顺序堆放。这可以看作是一种特殊的顺序文件。
操作特点
- 查询/读取:
- 优点:非常适合顺序访问(即批量读取所有或大量记录)。例如,生成月度报表、进行统计分析等,效率极高。
- 缺点:随机访问(根据特定键值查找某条记录)效率极低。平均需要访问一半的文件记录(即
N/2次查找),性能为O(N)。
- 插入:
- 非常困难。为了保持顺序,新记录必须插入到正确的位置。这通常需要将插入点之后的所有记录都向后移动,成本非常高。通常的解决方案是使用一个临时的日志文件来缓存新增记录,定期再与主文件进行合并。
- 删除:
- 通常采用逻辑删除,即只做一个删除标记,而不是立即物理删除。记录会在后续的文件重组中被真正清除。
优缺点
- 优点:结构简单;节省存储空间(几乎没有额外开销);顺序访问效率极高。
- 缺点:随机访问效率低下;插入和删除(物理上的)操作非常耗时。
适用场景
- 磁带备份
- 历史数据归档
- 批量数据处理(如银行夜间结算、工资计算)
- 日志文件
2. 索引文件
核心概念
为了克服顺序文件随机访问性能差的问题,引入了索引。索引文件由两部分组成:
- 主文件:记录本身,它们可以是无序的(堆文件)或顺序的。
- 索引:一个更小的文件,它就像是书本的“目录”。索引本身由一系列 (键值,指针) 对组成。
- 键值:对应主文件中记录的主键。
- 指针:指向该键值对应记录在主文件中的物理存储地址。
索引本身通常是一个顺序文件,并且常使用高效的数据结构(如B树、B+树)来组织,以加速在索引中的查找。
操作特点
- 查询/读取(随机访问):
- 先在索引中快速查找指定的键值(因为索引小且有序,查找非常快)。
- 找到后,根据指针直接到主文件中访问对应的记录。
- 性能从
O(N)提升到O(log N)(如果索引是树结构)甚至O(1)(如果索引是哈希结构)。
- 插入:
- 将新记录追加到主文件的末尾(很快)。
- 然后将新的(键值,指针)对插入到索引中(因为索引是有序的,需要维护顺序,但相比移动整个主文件,代价小得多)。
- 删除:
- 在主文件中删除记录(通常也是逻辑删除)。
- 在索引中删除对应的(键值,指针)项。
优缺点
- 优点:随机访问性能极佳;插入和删除操作比纯顺序文件高效。
- 缺点:需要额外的存储空间来存放索引;每次插入和删除都需要更新索引,带来一定的开销。
适用场景
- 需要频繁进行随机查询的在线交易处理系统(OLTP),如根据订单号查订单、根据用户ID查信息。
- 数据库表中的主键索引。
3. 索引顺序文件
核心概念
索引顺序文件是顺序文件和索引文件优点的结合体,旨在同时高效支持顺序访问和随机访问。这是最常见的一种文件组织方式。
它包含两个层级:
- 主文件:记录严格按照主键顺序存储。(继承了顺序文件的优点)
- 索引:通常是一个稀疏索引。
- 稠密索引:为主文件中每一条记录都创建一个索引项。
- 稀疏索引:只为主文件中每个数据块(或页)的第一条记录创建索引项。
工作流程(以稀疏索引为例)
假设要查找键值为 K 的记录:
- 在索引中查找最后一个小于或等于
K的索引项。这个索引项指向主文件中的一个数据块。 - 由于主文件是顺序的,可以确定记录
K只可能存在于这个索引项指向的数据块中。 - 进入这个指定的数据块,在块内进行顺序查找,找到目标记录。
由于数据块可以一次性读入内存,在块内的顺序查找非常快。
操作特点
- 查询/读取:
- 随机访问:通过索引定位到块,再在块内查找,性能很好(
O(log N) + O(块内记录数/2))。 - 顺序访问:因为主文件本身有序,所以顺序遍历的效率依然非常高。
- 随机访问:通过索引定位到块,再在块内查找,性能很好(
- 插入:
- 为了保持主文件顺序,插入仍需移动记录。但通过以下技术大大降低了开销:
- 溢出区:为每个数据块预留一个溢出区(可以是同一磁盘区域的延伸或一个单独的链表)。新记录先插入到正确块对应的溢出区中,避免立即移动大量数据。定期再对整个文件进行重组,将溢出区记录合并回主区。
- 为了保持主文件顺序,插入仍需移动记录。但通过以下技术大大降低了开销:
优缺点
- 优点:同时兼顾了顺序访问和随机访问的高性能;索引是稀疏的,比稠密索引更节省空间。
- 缺点:结构比前两者复杂;插入和删除仍然可能引发溢出,需要定期重组以维持性能。
适用场景
- 需要同时进行批量处理和实时查询的系统,是大型机系统和传统数据库系统中非常经典的组织方式。
- 例如,银行的客户账户系统:既需要批量计算利息(顺序处理),又需要实时响应客户的查询和交易(随机访问)。
总结对比
| 特性 | 顺序文件 | 索引文件 | 索引顺序文件 |
|---|---|---|---|
| 存储结构 | 记录按主键物理连续存储 | 主文件无序/有序 + 稠密索引 | 主文件有序 + 稀疏索引 |
| 随机访问 | 极慢,O(N) |
极快,O(log N) 或 O(1) |
快,O(log N) + 顺序扫描块 |
| 顺序访问 | 极快,O(N) |
慢(主文件无序时) | 快,O(N) |
| 插入/删除 | 非常困难,成本高 | 较容易(追加+更新索引) | 较容易(使用溢出区) |
| 空间开销 | 小(无额外开销) | 大(需要存储索引) | 中等(稀疏索引+溢出区) |
| 典型应用 | 磁带、批量处理、日志 | OLTP、高频随机查询 | 兼顾批处理和实时查询的系统 |
简单来说:
- 只要顺序处理 -> 选顺序文件。
- 只要随机访问 -> 选索引文件(或哈希文件)。
- 两者都要 -> 选索引顺序文件。
Do not communicate by sharing memory; instead, share memory by communicating.

浙公网安备 33010602011771号