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

news2024/11/17 16:24:12

目录

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 上使用了一个附加的间接指针层。

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

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

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

        至此,全文结束。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解锁TikTok内容趋势——高效获取TikTok标签信息接口

一、引言 在TikTok这个全球热门的短视频平台上,标签(Hashtags)是用户和内容创作者连接、发现新内容的重要工具。为了帮助品牌、市场分析师、内容创作者等更好地理解和利用TikTok上的内容趋势,我们推出了一款全新的接口服务&#…

OPenCV实现把人形轮廓画在实时视频画面中

操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:Visual Studio Code编程语言:C11 1.功能描述 当你从摄像头读取实时视频时,如果想在视频的画面中画一个方框,或者是画一个圆,是很简单的事情,可是…

硬盘格式化NTFS好还是exFAT好 U盘存储文件用哪个格式好? 硬盘用exfat还是ntfs mac不能读取移动硬盘怎么解决

在计算机世界中,文件系统是数据管理的基石,而NTFS和exFAT无疑是这块基石上的两大巨头。它们各自拥有独特的特点和优势,并在不同的使用场景中发挥着重要作用。 什么是文件系统 文件系统提供了组织驱动器的方法。它规定了如何在驱动器上存储数…

Boost 网络库

asio 网络编程的基本流程创建 socket绑定acceptor连接指定的端点服务器接受连接 网络编程的基本流程 服务端 1)socket----创建socket对象。 2)bind----绑定本机ipport。 3)listen----监听来电,若在监听到来电,则建…

如何做好媒体邀约宣发

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 如何做好媒体邀约:7个步骤,3个注意点,1个提醒。 一,媒体邀约七步走 明确活动的目的:首先,明确媒体邀约宣发的目标…

深度 | OpenAI COO闭门访谈:大模型已至,企业如何落地?

图片来源:OpenAI Z Highlights: 仅仅允许公司单一部门使用互联网非常可笑。类似地,给所有员工开放AI权限将会是最大的催化剂。当前阶段的AI企业级部署,要让员工熟悉AI工具的使用方式,让他们将工作流程与模型的功能紧密…

每天写java到期末考试(6.19)--1.百元买百鸡

好久没有写了,现在赶快先复习复习,哈哈,加油! 收获:写了好久,才写好这一个问题,提示自己不要好高骛远,前期先踏踏实实写好每一个代码; 被困住原因 取余%与整除/区别 pa…

GaussDB技术解读——GaussDB架构介绍(五)

GaussDB架构介绍(四)从云原生关键技术架构&关键技术方案两方面对GaussDB云原生架构进行了解读,本篇将从关键技术方案的事务存储组件、SQL引擎组件、DCS组件、实时分析组件等方面继续介绍GaussDB云原生架构。 目录 事务存储组件 1、本地…

openh264 Pskip 模式决策原理:WelsMdPSkipEnc 函数

WelsMdPSkipEnc函数介绍 函数功能:它尝试对当前宏块(MB)进行P-skip模式的编码,并返回一个布尔值表示是否成功。函数参数: 函数接受编码上下文 pEncCtxMD结构体 pWelsMd当前宏块 pCurMb宏块缓存 pMbCache 函数调用关系…

人生的乐趣,在于对真知的追求

子曰:朝闻道,夕死可矣! 孔子说:早上听到关于世界的真理,哪怕晚上就die了都可以。 这句话很有力量而经常被人引用,表达出我们如何看待沉重的肉身和精神世界。 我们的生活目的:道。 —— 要了解…

五种HTTP数据传输方式

在前端开发过程中,后端主要提供 http 接口来传输数据,而这种数据传输方式主要有五种: url paramqueryform-urlencodedform-datajson 下面就让我们一起来了解一下在Nest.js中如何使用这五种HTTP数据传输方式: 一,创建项目 使用nest new 创建一个nest的项目 nest new 项目名称 …

【送模板】5张图,帮你轻松搞懂OKR工作法

OKR是目标与关键结果法的缩写,OKR运用在工作中就是强调对业务进行逻辑思考,找到目标与关键结果之间的因果关系。这种因果关系的是否准确决定我们努力的价值。 OKR是一种高效的目标管理方法。“O”就是object,目标的意思,“kr”就…

项目的打包

一:打包到微信小程序 1)vscode打包 2)在微信小程序开发工具中打开路径,上传. 疑问:为什么pnpm bulid:mp-weixin用于打包,pnpm dev:mp-weixin也可生成对应路径下的文件?? 打包的是没有热重载,且打包体积更小. 二:条件编译 vscode可以打包成能在不同平台上运行的代码.但是有…

08--LVS网站高并发解决方案

前言:LVS,工作稳定,抗负载能力强,属于运维基础,这里将lvs两种模式的部署方式在这里记录一下,并在示例完成后,补充一下基础概念。本章不可避免的涉及到一些网络方面知识,会形象简单的…

被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?

引言:在使用 MyBatis 进行数据库操作时,#{} 和 ${} 的区别是面试中常见的问题,对理解如何在 MyBatis 中安全有效地处理 SQL 语句至关重要。正确使用这两种占位符不仅影响应用的安全性,还涉及到性能优化。 题目 被拷打已老实&…

富唯智能打造的AGV搬运机器人转运机器人

AGV搬运机器人&转运机器人 AGV搬运机器人,内部搭载ICD系列核心控制器,拥有不同的移载平台,负载最高可达 1000kq;重复精度高达5mm;支持 Wi-Fi漫游,实现更稳健的网络数据交互;无轨化激光 SLAM 导航,配合 3D 避障相机…

2024年仿真建模与多媒体技术国际学术会议(ISMMT 2024)

全称:2024年仿真建模与多媒体技术国际学术会议(ISMMT 2024) 会议网址:http://www.ismmt.com 会议时间:最终通知见官网! 会议地点: 深圳 投稿邮箱:ismmtsub-conf.com投稿标题:ArticleTEL。投稿时…

什么是“基准测试集”呢?

基准测试集有三部分构成:DocumentSet、QuerySet、RelevantJudgement。在比较多个IR系统孰优孰劣的时候,要做的就是:使用统一的DecumentSet建立索引,然后使用统一的QuerySet去进行查询,最后使用统一的judgement进行评判…

web爬虫笔记:js逆向案例九(某多多 anti_content参数)补环境流程

web爬虫笔记:js逆向案例九(某多多 anti_content参数)补环境流程 一、目标网站:aHR0cHM6Ly9tb2JpbGUueWFuZ2tlZHVvLmNvbS8= 二、接口分析 1、快速定位加密位置(通过搜索/cells/hub/v3快速定位到加密js文件) 2、通过分析可知&#

HSP_09章 模块和包

文章目录 P102 模块的常见应用场景分析P103 模块的基本介绍1. 导入模块import2.实例演示 P104 自定义模块1.自定义模块的介绍:2. 注意事项和使用细节2.1 使用 __name__可以避免模块中测试代码的执行2.2 使用__all__可以控制 import *时,哪些功能被导入,注意: import…