数据库系统实现 磁盘存储与索引
磁盘
-
磁盘容量:盘面* 磁道扇区扇区容量
-
磁盘存取延迟: 平均寻道时间 + 平均旋转延迟 + 传输时间
- 平均旋转延迟: 旋转一周时间/2
- 传输时间: 数据量/数据传输速度
- 位密度:单位长度数据量
- 道密度:半径方向单位长度道数
-
磁盘访问加速
- 连续盘块放置在同一柱面,减少寻道时间
- 多磁头并行访问磁盘,增加单位时间磁盘盘块访问数量
- 电梯算法:单向持续循环查找
记录存储
-
定长记录的磁盘存储形式:
- 块首部(盘块记录信息,元组信息,块内偏移,修改时间戳) -
记录地址:块内增加一个正向增长的纪录偏移量表,记录从后向前写,偏移量表从前往后写;
-
访问记录:通过记录所在块物理地址访问,块内查询偏移量即可
-
映射表:数据库地址映射到物理地址(数据库中全部可访问数据项均在映射表中占据一个表项)
-
转换表:只记载当前在内存的中数据项(数据库地址带内存地址的转换)
-
指针混写:对象传入内存时,对象内部指针是否改写成内存地址,还是保持指向数据库地址
- 自动混写:写入内存块时自动为指针和地址定位,写入地址转换表(数据库指针到物理地址的映射)
- 查询转换表,如果指针指向的对象已经写入内存,则“混写”,直接将内存地址防置在转换表,
- 如果不在内存中,则将对象写入内存缓冲区,并混写
- 按需混写,每次使用一个指针时,若转化表存在则直接转换,不存在则将对象写入内存,并将增加一转换表项
- 自动混写:写入内存块时自动为指针和地址定位,写入地址转换表(数据库指针到物理地址的映射)
-
块写回磁盘:块中 指着必须解混写
- 存在对块中元素的解引用时,块必须被盯住,解除盯住块时,必须解混写指向块的所有指针
- 每一个有数据项在内存中的数据库地址,转化表必须记录指向内存中那个数据项的混写指针的位置
- 将对一个内存当地孩子的一系列引用保存为附加在该地址转换表表项上的链表
- 用内存地址替代数据库地址
-
变长记录
- 具有变长字段的记录:将定长字段放在变长字段之前,首部中写入记录长度和第一个变长字段之外的所有变长字段的偏移量
- 具有重复字段的记录:重复字段直接用指针指向重复对象,首部中记录每个重复字段的位置指针和重复次数
- 跨块记录:表明是否是一个片段,表明是记录的第几个片段,指向下一片段的指针
记录在块中的组织
- 分隔:
- 定长记录无需分隔
- 变长记录使用块内偏移量
记录的修改
- 插入记录
- 直接无序插入
- 按主键插入,滑动后续元素(修改块内偏移量)
- 块满:在临近块中找空间,或者添加溢出块
- 删除记录
- 滑动删除记录空间,直接紧凑
- 映射表:(逻辑地址到物理地址),直接将物理地址置空即可
索引
- 稠密索引:数据文件中得每一个记录在索引文件中都有一个索引项
- 稀疏索引:数据文件中存储块在索引文件中共同占用一个索引项
- 主索引: 直接在排序主键上建立的索引项
- 顺序文件:直接主键排序生成文件
- 索引项:键和记录地址指针
- 优点:索引块小,键有序,索引文件放入内存,查找过程不涉及磁盘IO
- 多级索引:一级稠密索引,高级稀疏索引,加快查找速度
- 主索引根据记录位置决定,辅助索引不决定记录位置
- 辅助索引都是稠密索引,因为它不决定记录位置
散列表
- hash之后对应桶有空间,直接插入,或者插入溢出块
- 扩展列表
- 用一个指向块的指针数组表示桶
- 指针数组能增长,长度是2的幂
- b位二进制序列,前i位表示桶数目,i值随文件增长
代价估计(中间结果)
-
选择
-
k-d树
-
将二叉搜索树推广到多维:每一层根据一个属性判断并分裂成两个数据集
- 部分匹配:属性值已知层节点上,向一个子集方向查找,属性值未知则向两个子节点方向查找
- 范围查询:范围跨越节点划分时,同时探查两个节点
-
R树:扩展B树,每个节点代表一个区域,归并节点位于哪个区域