【索引】数据库索引之顺序索引概述

目录

1、索引的基本概念 

2、顺序索引

3、稠密索引和稀疏索引

        3.1 什么是稠密索引?

        3.2 什么是稀疏索引?

4、索引的更新

        4.1 索引的插入操作

        4.1 索引的删除操作

5、辅助索引


1、索引的基本概念 

        数据库中的索引与图书馆中书的索引作用相同,都是为了进行快速的查找。例如,为了根据指定的数据 ID 检索一条记录,数据库首先会去查找索引,找到相应记录所在的磁盘块,然后取出该磁盘块,最后得到该条指定的记录。//数据库索引用来加快数据的查询速度

        通常,数据库有两种基本的索引类型:

  • 顺序索引:基于值的顺序排序。
  • 散列索引:基于将值平均分布到若干散列桶中,一个值所属的散列桶由散列函数( hash function)决定。

        对于不同类型的索引,没有说哪一种类型的索引是绝对最好的,只能说某种类型的索引对特定的数据库是最适合的。每种类型索引都必须基于查找、插入、删除的时间以及空间的开销(索引占据的存储空间)来进行综合评价。//评价索引需要考虑时间和空间等因素

        使用索引需要占用额外的存储空间。不过占用额外空间的大小适度,那么牺牲一定的存储空间来换取性能的提高就是值得的

        本篇文章主要介绍顺序索引的相关概念,散列索引的相关内容将在后续的文章中进行探索。

2、顺序索引

        顺序索引是指按顺序存储搜索码的值,并将每个搜索码与包含该搜索码的记录关联起来的索引

所谓搜索码是指用于在文件中查找记录的属性或属性集。如果一个文件上有多个索引,那么它就有多个搜索码。//通俗的说就是表中的一个或多个字段

        索引的原理就是把一条复杂的记录通过一小段信息进行标记,找到标记就找到了该条记录,从而节约查找时间,因此,怎么样去组织这样一小段信息,成了我们需要探讨的问题

        如果包含记录的数据库文件按照某个搜索码指定的顺序进行排序,那么该搜索码对应的索引称为聚簇索引(clustering index)。聚簇索引也称为主索引( primary index);//主索引通常建立在主键上,但并不一定要求唯一性,它也可以建立在其他非唯一列上

        如果搜索码指定的顺序与数据库文件中记录的物理顺序不同,那么该搜索码对应的索引称为非聚簇索引(nonclustering index)或辅助索引(secondary index)。//非聚簇索引中一般索引与数据文件分开存放

聚簇索引和非聚簇索引在数据存储上的区别:

  • 如果主索引是聚簇索引,那么表中的数据记录将按索引键的顺序进行物理存储。(查找一步到位)
  • 如果主索引是非聚簇索引,索引和数据记录分开存储,索引项指向数据记录的存储位置。(需要多次查找)

        总结:聚簇索引的数据和索引存储在一个文件中, 它的叶子节点包含实际的数据记录本身,而不是指向数据记录的指针。这不同于非聚簇索引,非聚簇索引的叶子节点包含指向数据记录位置的指针

        一般可以使用的顺序索引有两类:稠密索引和稀疏索引。接下来,将详细介绍这两种索引。

3、稠密索引和稀疏索引

        索引项或索引记录由一个搜索码值和指向具有该搜索码值的一条或者多条记录的指针构成。指向记录的指针包括磁盘块的标识和标识磁盘块内记录的块内偏移量//索引中存储的是数据存放的磁盘地址

        3.1 什么是稠密索引?

        在稠密聚集索引中,索引项包括搜索码值以及指向具有该搜索码值的第一条数据记录的指针具有相同搜索码值的其余记录顺序地存储在第一条数据记录之后,由于该索引是聚集索引,因此记录根据相同的搜索码值排序。//精确查找
        在稠密非聚集索引中,索引必须存储的是指向所有具有相同搜索码值的记录的指针列表。下图为稠密索引示例:

        //稠密索引其实就是为每一条记录都建立一个索引,然后通过该索引可以直接找到指定的记录,所谓的稠密就是密集的建立索引的意思,一对一的索引

        3.2 什么是稀疏索引?

        在稀疏索引中,只为搜索码的某些值建立索引项。只有当关系按搜索码排列顺序存储时才能使用稀疏索引,换句话说,只有索引是聚集索引时才能使用稀疏索引//范围查找

        和稠密索引一样,每个索引项也包括一个搜索码值和指向具有该搜索码值的第一条数据记录的指针。为了定位一条记录,我们找到其最大搜索码值小于或等于所查找记录的搜索码值的索引项。然后从该索引项指向的记录开始,沿着文件中的指针查找,直到找到所需记录为止。下图为稀疏索引示例:

        //稀疏索引顾名思义就是索引建的比较松散,索引与数据不是一一对应的。通过稀疏索引大致定位一个搜索范围,然后再从定位的范围当中进行查找,从而节省搜索量,因为涉及到范围查找,所以要求查找的数据必须有一定的顺序

        比如一本字典,每页页眉都顺序地列出了该页中按字母序出现的第一个单词。字典中每页顶部的单词共同构成了字典页内容的稀疏索引。//就比如 A->B->C...这种顺序,其中 A、B、C就是稀疏索引

        有没有想过,为什么需要有这两种索引呢?

        这是因为我们在设计索引时,必须在存取时间和空间开销之间进行权衡。利用稠密索引通常可以比稀疏索引更快地定位一条记录。但是,稀疏索引也有比稠密索引优越的地方:它所占空间较小,并且插入和删除时所需的维护开销也较小。

        比如,使用稀疏索引为每个数据块建立索引项是一个非常好的策略。原因在于,处理数据库查询的开销主要由把块从磁盘读到主存中的时间决定。一旦将块放入主存,扫描整个块的时间就是可以忽略的,只要记录不在溢出块中,就能使块的访问次数最小,同时能保持索引尽可能小(减少空间开销)。//使用稀疏索引定位包含所要查找记录的块,既减少了磁盘的I/O操作次数,又减少了索引的存储空间,这种方案在数据量非常大的时候具有优势

4、索引的更新

        无论采用何种形式的索引,每当文件中有记录插入或删除时,索引都需要更新。索引更新可以设计为对旧记录的删除,以及随后对新记录的插入。因此,索引更新只需要考虑索引的插入删除,并不需要明确地考虑更新。

        4.1 索引的插入操作

        系统首先用待插人记录中的搜索码值进行查找,并根据索引是稠密索引还是稀疏索引而进行下一个操作。

        稠密索引的插入操作:

        如果该搜索码值不在索引中,系统就在索引中合适的位置插入具有该搜索码值的索引项。//新增索引项

        否则进行如下操作:

  1. 如果索引项存储的是指向具有相同搜索码值的所有记录的指针,系统就在索引项中增加一个指向新记录的指针。//修改索引项
  2. 如果索引项存储一个仅指向具有相同搜索码值的第一条记录的指针,系统把待插入的记录放到具有相同搜索码值的其他记录之后。//不修改索引

        稀疏索引的插入操作:

        假设索引为每个块保存一个索引项。如果系统创建一个新的块,它会将新块中出现的第一个搜索码值插人到索引中。另一方面,如果这条新插入的记录含有块中的最小搜索码值,那么系统就更新指向该块的索引项;否则,系统对索引不做任何改动。//稀疏索引指向块,所以当插入记录不是边界值时,不需要去更改索引

        稠密索引指向具有相同搜索码值的第一条记录和指向具有相同搜索码值的所有记录的区别:

        举一个例子来说明,比如有一个学生表,按班级编号(ClassID)建立索引:

学号 (StudentID)姓名 (Name)班级编号 (ClassID)
1001Alice1
1002Bob1
1003Carol2
1004Dave2
1005Eve1

        当稠密索引仅指向具有相同搜索码值的第一条记录时,索引会为每个唯一的搜索码值创建一个索引条目,但每个条目仅指向具有该值的第一条记录。这种方式的索引条目是唯一的,并且会依赖于数据记录的链表或块中的其他结构来访问所有具有相同搜索码值的记录。索引表如下:

ClassID指针 (Pointer)
1指向(StudentID 1001)
2指向(StudentID 1003)

        数据记录之间的链表:

  • StudentID 1001 -> StudentID 1002 -> StudentID 1005
  • StudentID 1003 -> StudentID 1004

        当稠密索引指向具有相同搜索码值的所有记录时,索引的每个条目指向的是一个数据结构,该结构包含所有具有该搜索码值的记录。这种方法意味着索引条目直接指向多个记录,而不是仅指向第一条记录。索引表如下:

ClassID指针 (Pointer)
1指向(StudentID 1001, 1002, 1005)
2指向(StudentID 1003, 1004)

        这两种指向方式的区别在于:

        当稠密索引仅指向第一条记录时,索引条目唯一,指向第一条记录。但需要通过链表或其他结构遍历所有记录。

        当稠密索引指向所有记录时,索引条目包含所有记录的指针。可以直接访问所有相关记录,查询更高效,但索引空间开销更大。

        //稠密索引并不是唯一索引,但是稠密索引与记录一一对应是一种比较好的设计,我们建立索引时也应该尽量去选择那些重复性不多的字段

        4.1 索引的删除操作

        删除一条记录,系统首先查找要删除的记录,然后下一步的操作也取决于索引是稠密索引还是稀疏索引。

        稠密索引的删除操作:

        如果被删除的记录是具有这个特定搜索码值的唯一的一条记录,系统就从索引中删除相
应的索引项。//删除整个索引项

        否则采取如下操作:

  1. 如果索引项存储的是指向所有具有相同搜索码值的记录的指针,系统就从索引项中删除指向被删除记录的指针。//删除对应指针
  2. 否则,索引项存储的是指向具有该搜索码值的第一条记录的指针。在这种情况下,如果被删除的记录是具有该搜索码值的第一条记录,系统就更新索引项,使其指向下一条记录。

        稀疏索引的删除操作:

        如果索引不包含具有被删除记录搜索码值的索引项,则索引不必做任何修改。

        否则系统采取如下操作:

  1. 如果被删除的记录是具有该搜索码值的唯一记录,系统用下一个搜索码值的索引记录替换相应的索引记录。如果下一个搜索码值已经有一个索引项,则删除而不是替换该索引项。
  2. 否则,如果该搜索码值的索引记录指向被删除的记录,系统就更新索引项,使其指向具有相同搜索码值的下一条记录。

        //通过对稠密索引和稀疏索引的更新和删除操作,可以更好的了解这些索引的特征和数据组织形式

5、辅助索引

        辅助索引必须是稠密索引,对每个搜索码值都有一个索引项,而且对文件中的每条记录都有一个指针。

        辅助索引是数据库中除了主键(或聚簇索引)之外的额外索引,用于加快数据检索的速度。它们通常是基于表中的非唯一列或组合列构建的,允许数据库在执行查询时快速定位到符合条件的记录。

        为什么辅助索引不能是稀疏索引呢?

        我们知道稀疏索引可以只存储部分搜索码的值,然后通过顺序扫描文件的一部分,总是可以找到两个有索引项的搜索码值之间的搜索码值所对应的记录。如果辅助索引只存储部分搜索码值,两个有索引项的搜索码值之间的搜索码值所对应的记录可能存在于文件中的任何地方,并且通常只能通过扫描整个文件才能找到它们。//如果辅助索引为稀疏索引,那么通过辅助索引不能直接定位一条数据,也就失去了该索引的意义

        辅助索引必须包含指向每一条记录的指针。我们可以用一个附加的间接指针层来实现非候选码的搜索码上的辅助索引。在这样的辅助索引中,指针并不直接指向文件,而是指向一个包含文件指针的桶。下图是一个辅助索引的结构,它在 instructor 文件的搜索码 salary 上使用了一个附加的间接指针层。

        由于辅助码的顺序和物理码的顺序不同,因此如果我们想要按辅助码的顺序对文件进行顺序扫描,那么每读一条记录都很可能需要从磁盘读入一个新的块,这是很慢的。//因为数据库的数据一般都是按照聚簇索引进行排序的,所以不要使用辅助索引(非聚簇索引)进行范围查找

索引的自动生成
        如果一个关系声明为有一个主码,大多数数据库实现会在主码上自动创建一个索引。只要一个元组插入到关系中,该索引就可以用来检查没有违反主码约束(即没有重复的主码值)。

        辅助索引虽然能够提高使用聚集索引搜索码以外的码的查询性能,但是,辅助索引显著增加了数据库更新的开销。所以我们需要根据对查询和更新相对频率的估计来决定哪些辅助索引是需要的。

        至此,全文结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/733907.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

echarts Y轴展示时间片段,series data数据 也是时间片段,鼠标放上去 提示框显示对应的时间片段

功能要求 1、折线图,展示每天对应的一个时间片段 2、echarts Y轴展示时间片段,如:[00:00,03:00,05:15] 3、X轴展示日期,如:[xx年xx月xx日] 后端返回的数据结构,如 [{xAdate:"2024-06-15",data:…

汽车OTA--Flash RWW属性为什么这么重要

目录 1. OTA与RWW 1.1 FOTA需求解读 1.2 什么是RWW 2.主流OTA方案 2.1 单Bank升级 2.2 基于硬件A\B SWAP的FOTA方案 2.3 基于软件实现的FOTA方案 3.小结 1. OTA与RWW 1.1 FOTA需求解读 CP AUTOSAR R19-11首次提出了FOTA的概念,针对FOTA Target ECU提出了多…

《计算机英语》 Unit 3 Software Engineering 软件工程

Section A Software Engineering Methodologies 软件工程方法论 Software development is an engineering process. 软件开发是一个工程过程。 The goal of researchers in software engineering is to find principles that guide the software development process and lea…

2024年全国青少信息素养大赛python编程复赛集训第九天编程题分享

整理资料解析答案非常不容易,感谢各位大佬给个点赞和分享吧,谢谢 今天题目较简单:适合小学组 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准…

集合注意事项

目录 我们为什么要用到集合中的迭代器 List实现类的循环遍历 Set集合 HashSet TreeSet Map Hashmap Treemap Hashtable map的遍历方式 Collections的一些静态方法 我们为什么要用到集合中的迭代器 List实现类的循环遍历 如图我们对arraylist中加入了三个相同的“a”…

【软件工程】【22.04】p1

关键字: 软件需求规约基本性质、数据字典构成、内聚程度最高功能内聚、公有属性、RUP实体类、评审、测试序列、软件确认过程、CMMI能力等级 软件需求分类、DFD数据流图组成(实体)、经典详细设计、数据耦合、关联多重性、状态图、黑盒测试、…

使用ESP32和Flask框架实现温湿度数据监测系统

项目概述 在这个项目中,我们将使用ESP32微控制器读取温湿度传感器的数据,并将这些数据通过HTTP请求传输到基于Flask框架的服务器。Flask是一个轻量级的Python Web框架,非常适合快速开发和部署Web应用。通过这个项目,我们不仅可以了…

分享uniapp + Springboot3+vue3小程序项目实战

分享uniapp Springboot3vue3小程序项目实战 经过10天敲代码,终于从零到项目测试完成,一个前后端分离的小程序实战项目学习完毕 时间从6月12日 到6月22日,具有程序开发基础,第一次写uniapp,Springboot以前用过,VUE3也…

外部存储器

外部存储器是主存的后援设备,也叫做辅助存储器,简称外存或辅存。 它的特点是容量大、速度慢、价格低,可以脱机保存信息,属于非易失性存储器。 外存主要有:光盘、磁带、磁盘;磁盘和磁带都属于磁表面存储器…

跌倒识别:守护公共安全的AI技术应用场景-免费API调用

随着科技的不断进步,人工智能在各个领域的应用日益广泛,其中在公共安全领域,智能跌倒识别系统正逐渐成为守护人们安全的重要工具。本文将分享智能跌倒识别系统在不同场景下的应用及其重要性。 产品在线体验地址-API调用或本地化部署 AI算法模…

4、MFC:菜单栏、工具栏与状态栏

菜单栏、工具栏与状态栏 1、菜单栏1.1 简介1.2 创建属性设置菜单消息成员函数 1.3 实例 2、工具栏2.1 简介工具栏属性2.2 创建消息CToolBar类的主要成员函数 2.3 实例 3、状态栏3.1 简介3.2 创建CStatusBar类状态栏创建 3.3 实例 1、菜单栏 1.1 简介 菜单在界面设计中是经常使…

【AWS SMB】关于AWS 中小型企业 (SMB) 能力介绍及注意事项

文章目录 前言一、什么是 SMB?📢二、如何识别中小企业的需求三、中小企业营销活动的类型四、AWS 合作伙伴可获得的其他 AWS 机会4.1 AWS IQ4.2 APN 客户参与 (ACE) 计划 前言 AWS 中小型企业 (SMB) 能力合作伙伴专注于帮助中小型…

荒野大镖客2启动找不到emp.dll的7个修复方法,轻松解决dll丢失的办法

一、emp.dll文件丢失的常见原因 安装或更新问题:在软件或游戏的安装过程中,可能由于安装程序未能正确复制文件到目标目录,或在更新过程中文件被意外覆盖或删除,导致emp.dll文件丢失。 安全软件误删:某些安全软件可能…

甘肃旅游服务平台的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,公告信息管理,景点管理,酒店管理,基础数据管理,美食管理 前台账户功能包括:系统首页,个人中心&#xff0…

在 Equinix 上使用 MinIO 控制云数据成本

公有云改变了公司构建、部署和管理应用程序的方式,主要是向好的方向发展。在您刚开始使用时,公有云会提供基础架构、服务、支持和维护,以便快速启动和运行。它以几乎无限的方式提供最终的可伸缩性,无论应用程序的负载如何&#xf…

小米15系列将首发骁龙8 Gen4 SoC

高通已确认2024年骁龙峰会定于10月21日举行。在这次峰会中高通将推出其最新的移动芯片Snapdragon 8 Gen4 SoC。著名科技博主DigitalChatStation今天证实,骁龙8 Gen4将以小米15系列首次亮相。这意味着小米15系列将是第一款使用这款新旗舰处理器的手机。 这不是小米第…

和琪宝的厦门之旅~

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 引言 承接去年国庆的遗憾,我们将这次的旅行城市定为厦门。 琪宝是下午四点左右到…

湖南(市场调研)源点咨询 新产品上市前市场机会调研与研究分析

湖南源点调研认为:无论是创业公司,还是在公司内部探索新的项目或者新的产品线等,首先都要做“市场机会分析与调研“,要真正思考并解答以下疑问: 我们的目标客户群体是谁,他们如何决策? 我们所…

长尾式差分放大电路调零

长尾式放大电路用了两个参数相同的三极管,但实际上并没有完全相同的三极管,所以为了提高差分放大电路的对称性(一边电流增加多少,另一边电流减小多少,即能在电阻Re上产生的压降不变(后面做虚地处理)),在下图中加入可调…

FaceFusionSharp OnnxRuntime版 视频换脸

FaceFusionSharp OnnxRuntime版 视频换脸 目录 效果 项目 代码 下载 其他 效果 FaceFusionSharp OnnxRuntime版效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Threading; using System.Window…