首页 > 数据库 >数据库系统------存储和索引

数据库系统------存储和索引

时间:2024-11-07 21:56:59浏览次数:1  
标签:指向 记录 索引 搜索 ------ 键值 数据库系统 节点

索引

索引的作用

引入索引是为了 加快数据的访问,就像查字典一样,我们根据拼音或者偏旁查找具体的字会更快

索引项

  • 搜索键:用于查找记录的属性或属性集合
  • 指针:指向与搜索键值匹配的一个或多个记录

1

索引文件

索引文件是由一系列 索引项 组成的,索引文件通常比数据文件小

索引的基本类型

  • 有序索引:搜索键按顺序存储
  • 哈希索引:用哈希函数将搜索键分布到不同的桶中

索引评估指标

  • 支持的访问类型
    • 指定某属性值的记录,例如查找age=20的人
    • 范围查询,即属性值在某范围内的记录,例如查找10 <= age <= 20的人
  • 访问时间
  • 插入时间
  • 删除时间
  • 空间开销

有序索引

有序索引就是指,索引项要根据搜索键的值排序

主索引 (聚集索引)

主索引是与文件的顺序结构紧密相关的索引,它的搜索键决定了文件记录的顺序,通常在 顺序文件 中使用

顺序文件就是指,文件记录已经按照某个规则(比如某个属性的值)进行排序过了

主索引通常是主键,但并不绝对

辅助索引 (非聚集索引)

辅助索引为非主键字段提供索引支持,它的搜索键与文件的顺序无关

顺序索引文件

索引顺序文件是一种特殊的顺序文件,它结合了顺序文件的优势和索引的优势。它使用了一个主索引来对记录进行排序

数据记录通过主索引的查询指针快速访问,而无需扫描整个文件

密集索引和稠密索引

密集索引

每个搜索键值都有一个索引记录,简单来说,就是每条记录的搜索键值都必须有一个对应的索引项(可以是多对一,即多条记录有相同的索引键值)

2

密集聚集索引

存储每个搜索键值的索引记录,并指向该值的第一个记录,后续记录按顺序存储

3

也就是相同的搜索键就只有一个索引项,该索引项的指针指向第一个记录,后续的记录按顺序存储

密集非聚集索引

存储相同搜索键值的所有记录的指针

4

相同的搜索键只有一个索引项,每个索引项的指针指向一个 ,这个桶里存储了对应搜索键的所有记录的指针

稠密索引

只为某些搜索键值存储索引条目,适用于按搜索键顺序排列的记录

5

有些记录的搜索键值没有对应的索引项,索引项中,每个搜索键就是一组记录的开头,就相当于对记录进行分组,然后每个组中开头的记录的搜索键值作为索引项,所以要求要按顺序排列

稀疏索引相比于密集索引占用更少的空间和维护开销,但查找记录时可能较慢

优化:在每个 数据块 中放一个索引条目,指向该块中最小的搜索键值

6

多级索引

如果主索引太大而无法放入内存,可以将其作为顺序文件,再对其构建稀疏索引

  • 外层索引:指向主索引的稀疏索引
  • 内层索引:实际的主索引文件

7

如果外层索引还是太大,可以在构建一层索引

多级索引插入或者删除记录时,要同时更新每一层的索引,所以层级越多,相应的开销也越大

索引更新

多级索引,插入和删除的算法只是单级索引的简单扩展。也就是说,多级索引的插入和删除操作遵循相同的基本规则,只是它们会作用于多个索引层次

单级索引删除:

  • 稠密索引

    • 删除对应记录,如果搜索键值只有这么一个对应的记录,那么这个搜索键的索引项也要删除
  • 稀疏索引

    • 如果删除的记录的搜索键在索引文件中,那么删除该记录后,它对应的索引项也要删除,然后使用这条记录的下一条记录的搜索键替换
    • 如果下一个记录的搜索键值已经在索引中有对应的条目,那么就直接删除,不用替换

单级索引插入:

  • 稠密索引

    • 如果插入记录的搜索键在索引中不存在,就插入这个搜索键到索引中
  • 稀疏索引

    • 如果索引是稀疏的,并且每个索引条目代表的是文件中的一个块,那么只有在新插入的记录导致了新块的创建时,才需要修改索引。
    • 如果新块创建了新的记录,新块中的第一个搜索键值会被插入到索引中

位图索引

  • Bitmap 索引本质上是一个 位图

  • 对于关系中的 每一条记录,都有一个对应的位

  • 每个属性的每个可能值都有一个独立的位图。位图的长度等于关系中记录的数量,每一位代表一条记录

8

如上图所示,我们有一张表,具有5条记录,然后我们为 性别和收入水平 这两个字段创建了位图索引

比如说,下面这个,就是 字段性别的一个取值(男)的位图,10010表示第1条和第4条记录是男 (第1位和第4位是1)

9

然后我们可以对不同的位图进行与操作等等,从而实现查询,比如 mL1这两个位图相与,只有第1位为1,也就表示,性别为男,收入水平为L1的记录只有第一条

B树索引

B树

B树是一种多路平衡查找树

  • 平衡:所有的叶节点都在同一层
  • 有序:节点内有序,任意节点的左子树都小于它,右子树都大于它
  • 多路:对于 m 阶B树
    • 最多:m个分支,m-1个元素
    • 最少
      • 根节点:2个分支,1个元素
      • 其他节点:[m/2]个分支,[m/2]-1个元素

B树是向上生长的,也就是说,当某个节点溢出时,它分进行分裂,分裂成一颗子树,这颗子树的根节点合并到之前的父节点,是一个逐渐往上生长的过程

B树的节点结构

  • K 表示搜索键
  • P 表示指向子节点指针
  • B 表示指向记录的指针

非叶子节点

11

叶子节点

10

整体结构如下:每个节点的元素都能直接指向记录

12

B+树索引

B+树

B+树的大致结构和B树相同,以下介绍不同的点:

  • 对于B树来说,节点的元素个数总是比分支数少1,但是对于B+树来说,节点的元素个数总是和分支树相等
  • B+树的叶子节点通过一个链表串联起来

B+树的节点结构

13

对于叶子节点来说,P表示的是指向记录的指针,对于非叶子节点来说,P表示的是指向子节点的指针

其中叶子节点这一层通过链表串联起来

14

整体结构如下:只有子节点的元素能够直接指向记录
15

B树和B+树索引的对比

  • B树的每个节点的元素都能直接指向记录,B+树只有子节点的元素能够直接指向记录,B+树的子节点是记录的索引,内部节点是索引(子节点)的索引,所以B+树是一个多级索引
  • B树的搜索键只出现一次,不会重复出现,B+树的搜索键会重复出现,父节点的搜索键也会出现在对应子树的子节点中,从而使得B+树的子节点包含所有的搜索键(这也说明了为什么B+树节点的元素个数总是和分支数相等)
  • B树能够以更小的空间开销建立索引,每个节点都包含数据,遍历不方便,适合较小范围记录查询,不适合范围查询;B+树会造成重复搜索键的开销,但只有子节点包含数据,且通过链表串联,适合范围查询
  • B树的节点更新更加复杂,因为所有节点都包含数据,B+树的更新会简单点,内部节点只包含索引,子节点包含数据

总结

  • B树:适合单记录查询,尤其是对于查找操作要求较高的场景,且数据较为简单。B树在范围查询时的性能较差,且由于 数据存储在每个节点中,可能会导致空间利用率低

  • B+树:由于叶子节点的链表结构,特别适合范围查询和顺序扫描,空间利用率较高。它的 多级索引结构 使得它在处理大规模数据集时,尤其是数据库的索引查询中,具有显著优势

标签:指向,记录,索引,搜索,------,键值,数据库系统,节点
From: https://www.cnblogs.com/dylaris/p/18528700

相关文章

  • HTTP中的状态码
    HTTP中的状态码HTTP中的状态码状态码的作用状态码的职责是当客户端向服务器发送请求时,描述返回的请求结果,借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。类别原因1XX信息性状态码接收到的请求正在处理中2XX成功状态码请求正常处理完毕3......
  • 常用docker命令
    systemctlstartdocker#启动docker服务systemctlstopdocker#停止docker服务systemctlrestartdocker#重启docker服务dockerimages#列出所有镜像dockerps-a#列出所有容器dockerstop容器ID#停止运行指定的容器dockerrm容器ID#删除指定......
  • 物理层
    4_物理层计算机网络分层结构-物理层两种分层结构OSI体系结构应用层表示层会话层运输层网络层数据链路层物理层TCP/IP体系结构应用层运输层(TCP、UDP)网络层(IP)数据链路层物理层物理层基本概念物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不......
  • java-web-web后端知识小结
    spring框架三大核心:      IOC--控制反转      DI---依赖注入      AOP--面向切面编程web开发技术小结      1.过滤器,JWT令牌      2.三层架构             IOC,DI             AOP,全局异常处理,......
  • 数据链路层
    5_数据链路层数据链路层链路和数据链路链路一条点到点的物理线路段,中间没有其它的交换节点,一条链路只是一条通路的一个组成部分数据链路除物理链路外,还必须有通信协议来控制这些数据的传输,若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。现常见的方法就是使用适......
  • 【C++11】智能指针
    一.为什么需要智能指针        学习C++的人,一直在接触裸指针,一边感受着它的强大,一边感受着它的坑爹。当然,坑不坑爹在于开发者,指针本身近乎完美,但奈何用的人比较猥琐,给自己埋下无数的坑,还哭喊着指针不好用,那么今天要介绍的智能指针可以释放大家在使用裸指针时的一些压......
  • 【C++】C++11之函数对象,Lambda表达式和functional函数对象类型
    知识的学习在于点滴记录,坚持不懈函数对象        重载了函数调用运算符()的类的对象,即为函数对象。        std::function由上文可以看出:由于可调用对象的定义方式比较多,但是函数的调用方式较为类似,因此需要使用一个统一的方式保存可调用对象或者传递可......
  • UIAbility组件生命周期
    当用户打开、切换和返回到对应应用时,应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调,通过这些回调可以知道当前UIAbility实例的某个状态发生改变,会经过UIAbility实例的创建和销毁,或者UIAbility实例发生了前后台的状态切换。UIAbility的生命......
  • 免费且强大的PDF转换工具——PDFgear
    前言PDFgear是一款不可或缺的PDF文件处理工具,凭借其强大的功能和多样的特点,它能帮助用户更快速、高效地编辑和处理PDF文件,显著提升工作效率通过网盘分享的文件:pdf转换工具链接:https://pan.baidu.com/s/1ap37H9tP6brqTgfp4KQ16g?pwd=wh3j提取码:wh3j链接:https://pan.qu......
  • [luoguP1456] Monkey King
    题意给出\(n\)个集合\(S_1\cdotsS_n\),\(S_i=\{a_i\}\),每次给出\(x,y\),将第\(x\)和第\(y\)个元素所在的集合的最大值\(\div2\),合并两个集合,然后输出新集合的最大值。sol每次求出两个集合,记录两个集合的最大值并删除,将两个集合与两个最大值除以\(2\)后合并即可。......