• 《数据库原理》课程笔记 (Ch05-数据库存储结构)


    存储介质

    数据库采用多级存储器,用的最多的辅存是磁盘。磁盘的耗时主要在寻道时间

    磁盘上数据划分为大小相等的物理块,磁盘与内存间的数据交换以物理块为单位。好处:

    • 减少IO次数
    • 减少间隙的数目,提高磁盘空间利用率

    为了解决磁盘和内存之间速度不匹配,可设立缓冲区

    DBMS可以采用延迟写(一系列写入一起进行)与提前读(正在处理i位置时提前调入i+1位置)技术,减少I/O,改善性能。

    记录的存储结构

    记录

    • 定位法:每个字段按最大可能长度分配定长
    • 相对法:每个字段没有固定的长度,而用特殊的字符分隔
    • 计数法:每个字段的开始加上该字段长度信息

    记录到物理块

    每个物理块可容纳记录数(块因子)p=[B/R],B:物理块大小,R:固定长记录的大小

    通常,B=pR<R,即物理块会留出零头。为了利用这一部分,可以采用跨块组织。

    物理块到磁盘

    • 连续分配法:有利于顺序存取,不利于扩充
    • 链接分配法:各物理块用指针连接,有利于扩充,效率较差
    • 簇集分配法:结合上述两种方法,将一系列物理块串在一起,入口放在某地址
    • 索引分配法:每个文件有一个逻辑块号与其物理块地址对照的索引条目

    数据压缩

    • 消零或空格符法:例如00000用@5表示

    • 串型代替法:用某个约定的短串代替长串数据

    • 索引法:在用到这些串的地方,用指针引用索引表中的条目

    文件结构和存取路径

    访问文件的方式

    对数据库的操作最终要落实到对文件的操作。

    数据库对文件的要求

    更多的DBMS不用OS的文件管理系统,而是独立设计其存储结构。因为:

    • 传统文件系统不能提供DBMS功能所需的附加信息
    • 传统文件系统主要面向批处理,数据库系统要求即时访问、动态修改
    • 减少DBMS对OS的依赖,提高DBMS的可移植性

    文件的基本类型

    • 堆文件

      按照插入先后顺序存放。

      插入容易,查找不方便(只能顺序搜索),删除记录也较麻烦(需要空间回收)。

    • 直接文件

      记录的某一属性用散列函数直接映射成记录的地址。

      散列函数的设计较为困难;地址范围设的太大或太小都不好;要处理地址重叠问题。

    • 索引文件

      建立一个集中的映射机构,保存某些属性的值(如主键)与存储地址的映射。

      索引与散列的区别:索引文件有记录才占用空间,散列空文件也占用全部空间(因为必须留出整个空间)。

      针对非散列键和非索引属性的访问,都不能有效发挥直接文件或索引文件的优势。散列或索引失效时,散列的访问代价通常更大,因为需要遍历整个散列空间,而索引的条数较少。

    索引的建立与使用

    • 键值:索引键属性的可能取值

    • 主索引:索引是主键 —— 一个索引只有一个地址对应

      • 非稠密索引:按主键排序
      • 稠密索引:不按主键排序
    • 次索引:索引不是主键 —— 一个索引可能有多个地址对应

      • 簇集索引:按索引键排序并簇集,是稠密索引
      • 非簇集索引:不按索引键排序,是稠密索引,也叫无序索引、非簇集的稠密次索引、二次索引
    • 稠密索引:每个键值对应一个索引项。每增加一个键值,就要增加一个索引项,索引会有溢出的可能

    • 非稠密索引:不为每个键值设立索引项。可以节省索引的存储空间,代价是文件要按索引键排序。对一个文件,只能为一个索引键(一般为主键)建立非稠密索引。

    • 簇集索引:在稠密索引中,若键值不唯一,则每个键值可能对应多个记录,这时可以在索引区进行拉链簇集,把键值相同的记录在物理地址上集中存放

    动态索引

    动态索引是一种平衡多分树(即B-树),常用B+树。

    • 每个节点最多有2k个键值,k称为B+树的
    • 根节点至少有一个键值,其它节点至少有k个键值。节点内,键值有序存放
    • 除叶节点外,其它节点若有J个键值,则有J+1个子女
    • 叶节点都处于树的同一层

    用B+树实现主索引

    要找键值Kx所对应的记录时,从索引树的根开始,按照大小夹逼原理,自上而下地搜索。即:若Kx<K0,则沿P0所指的节点向下搜索;若Kx>Kn-1,则沿Pn所指的节点向下搜索;若Ki-1<Kx≤Ki,则沿Pi所指的节点向下搜索。

    索引集节点中的键值不一定是文件中当前存在的键值(仅起“导航路标”的作用)。在搜索过程中,即使发现索引集节点中的键值等于要找的键值,查找仍要按上述规则进行下去

    B+树提供的存取路径

    • 通过索引集进行树形搜索

    • 通过顺序集进行顺序搜索

    • 先通过索引找到入口,再沿顺序集顺序搜索

    效率

    搜索B+树所需的I/O次数决定于其级数L,最多经过L次I/O就可以搜索到,而B+树的级数决定于N(索引属性不同键值的数目),而不是记录数

    补充知识

    到底什么是稠密索引和非稠密索引

    稠密索引每个数据记录的键值对应一个索引项。也就是说,稠密索引为数据记录文件的每一条记录都设一个键-指针对。

    非稠密索引不为每个数据记录的键值设立索引项。也就是说,为数据记录文件的每个存储块设一个键-指针对。

    到底什么是主索引和次索引

    • 主索引:索引是主键 —— 一个索引只有一个地址对应(如上图所示)

      • 非稠密索引:按主键排序
      • 稠密索引:不按主键排序
    • 次索引:索引不是主键 —— 一个索引可能有多个地址对应(上图地址部分为一个地址列表)

      因为不按主键排序,所以必然是稠密索引

      • 簇集索引:按索引键排序并簇集(地址列表拉链)
      • 非簇集索引:不按索引键排序,也叫无序索引、非簇集的稠密次索引、二次索引
  • 相关阅读:
    Java进阶7并发优化4——JDK并发数据结构
    Java 进阶7 并行优化 JDK多任务执行框架技术
    Java进阶7 并发优化2 并行程序设计模式
    Java 进阶7 并发优化 1 并行程序的设计模式
    Java 进阶6 异常处理的陷阱
    Algorithm3: 获得一个int数中二进制位为1 的个数
    Algorithm2: 重复查过半数的元素
    Algorithm1: 全排列
    Java进阶5 面向对象的陷阱
    Java进阶2 数组内存和对象的内存管理知识
  • 原文地址:https://www.cnblogs.com/zxuuu/p/12969266.html
Copyright © 2020-2023  润新知