存储
磁盘空间管理
选择磁盘块大小作为页的大小。
跟踪空闲块:
- 维护一个空闲块的列表;
- 维护一个位图, 可以支持磁盘连续区域的快速识别和分配。
缓冲区管理器
把缓冲区划分为页集来管理可获得的主存,页集称为缓冲池。缓冲池中的主存页称为帧,即存放页的槽。
pincount 和 dirty(请求页时缓冲区工作P课本240页) 。
缓冲区替换策略:LRU(最进最少使用策略),时钟替换(每一个帧有一个referenced位,在帧的pincount变为0时开始启动,current不断循环+1直到找到一个pincount为0且referenced位关闭的页,如果该页pincount为0但referenced位开启则关闭current+1继续查找),FIFO,MRU(最近经常使用策略),随机策略
记录文件(页的集合组织成一个文件)
堆文件页中的数据不以任何顺序排序,通过重复请求下个记录的方式搜索文件中所有记录,每个记录有一个rid。
页的链表形式:
- 《堆文件名,首页地址》的表得到首页地址。
- 首页指向两个双向链表(指针其实是页的id),有空闲空间的和没有空闲空间的。
- 缺点是记录变长时可能都在空闲空间的链表上。
页目录形式:
- DBMS记录每一个堆文件的第一目录页位置。
- 每一个目录项指向堆文件的一页(或一系列页)。空闲空间可以通过在目录项维护一比特位来管理,说明是否相应页有空闲空间,或是该页表明页上空闲空间的数量。
页格式(组织一页空间存储记录集合)
页由一组槽组成,每一个槽对应一个记录。记录由<页号,槽号>标识,这是使得外部通过<页号,槽号>找到对应记录。另一种方式是给每个记录一个整数rid,再维护一个rid到相应记录的<页号,槽号>表,这种方法开销大,不太好,所以一般使用第一种方法。
定长记录
前N个槽中存放记录。如果移动的记录被外部引用,则不能使用这种方法。
使用一个比特位数组来记录。
变长记录
维护一个槽目录,每个槽由
<record offset, rcord length>
对组成,这样子当记录在内部页移动时,页号和槽号都是不变的。删除时将长度变为-1即可,不可将槽号去掉否则会影响后续记录的槽号。插入记录时先扫描槽目录是否有空闲槽,有则放于该处,否则增加新的槽。可以用于定长记录,如需要维护记录的某种排列顺序。
记录格式
定长记录:
变长记录:
- 由特殊分隔符分隔每个字段;
- 记录前面有一个字段偏移量数组(更好,可以直接访问每个字段,处理空值)。
索引
文件组织与索引
最简单的文件结构是无序文件(堆文件)
索引是组织数据记录的一种数据结构。
数据项指代存储在索引文件中的记录,搜索码值为k的数据项记为k*。数据项有三种形式(209页)第一种方式的索引是一种特殊的文件组织,不同于有序的文件记录。
一般只有第一种是聚簇索引,其他是非聚簇索引。
索引数据结构
树结构索引
ISAM(索引顺序存取方法)
完全静态,主叶子页的数目在文件创建期间是固定的,溢出页。不对索引级页加锁是ISAM优于B+树动态结构的一个重要优点。当数据分布和大小相对稳定而使得溢出链很少时,ISAM将优于B+树。可以顺序分配叶子页。
B+树
以下在讨论搜索,插入和删除算法时前提是不存在重复。
搜索:
插入:
- 插入如果引起叶子节点分裂,则将新旧节点分开的中间码复制上去。
- 如果又引起了索引节点分裂,则将中间码弹上去。
- 使用受限的重分布:叶子节点在分裂前先查看兄弟节点看是否能重分布,非叶子节点就不需要了(因为记录的整体趋势是增加,叶子节点的分裂需要记录前后兄弟节点指针,而索引节点不需要)。
删除:能重分布就重分布,不能重分布就合并节点。重分布只会影响父节点的某个值,合并节点则父节点要删除第二节点的索引项,可能还会影响高度。
处理重复问题:
- 使用溢出页来处理;
- 像处理其他项一样处理,搜索给定码值最左边数据项。
- 以数据项的第三种方式表示,即维护一个列表。
码压缩:减少搜索码所占空间(前缀码压缩:如果是字符串可能取前面几个字符即可,不需要全部)。
块加载B+树:已经有了数据集合,在某个字段上创建索引。先将数据项排序,为根分配一个空页,每个索引项指向数据项的一页,满了则进行分裂。