简介
编辑
索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。
例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。(在结构型数据库中不要想当然的因为肉眼看到的表设计是结构型的如字段结构,就认为存储结构也是结构型的,恰恰存储是堆结构,所以数据存储本身是没有目录结构的,所以没有索引那么只能全部遍历查找,而不是默认就可以指定字段查询,所以索引才是目录结构)
1、扫描以及查找
对于扫描(scan)和查找(seek)这两种方式是数据库里面从基础数据表里获取的数据的基本方式。
a、当一张表为堆表(没有任何索引)的时候或者获取的数据列不存在任何索引来供查找,此种数据的获取只能通过全表扫描过滤获取,如果存在索引项会通过索引项的扫描来获取数据,提高获取数据的速度。
由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。
从数据搜索实现的角度来看,索引也是另外一类文件/记录,它包含着可以指示出相关数据记录的各种记录。其中,每一索引都有一个相对应的搜索码,字符段的任意一个子集都能够形成一个搜索码。这样,索引就相当于所有数据目录项的一个集合,它能为既定的搜索码值的所有数据目录项提供定位所需的各种有效支持 [1] 。
基本概念
编辑
●
搜索码。它表示的是记录各种字符段的一个集合,它可以是一个或者是多个字符段的任意序列组合,并不是惟一的一个标识记录。
●
数据目录项。即为索引的相关元素,在建立索引的过程中,数据目录项一般具有各种不同的选择方式。
●
记录ID。每一个/段索引在存储内容中惟一的一个标识符。
聚集索引和非聚集索引:聚集索引简单来说就是书自带的目录,和书本身就是一体的,只能有一个,可以直接找到物理存储。非聚集索引就是外部自定义的目录,需要在外面再拿不同的纸记录位置的地址,所以更占空间,也没自带的目录快,但是可以不限数量,比如一个班的同学根据自己的理解都对一本参考书额外记录了书内容的目录。
很明显的获取数据最快的方式是通过聚集索引,因为它叶子节点就是数据页,同样叶子节点的数据页物理顺序也是按照聚集索引的结构顺序进行存储,这也就造成了一个数据表只能存在一个聚集索引,并且聚集索引所占据的磁盘空间要远远小于非聚集索引。
而对于非聚集索引的叶子节点存储的是索引行,获取数据的话必须通过索引行所记录的数据页的地址(聚集索引键或者堆表的RID),这一特性也就是造就了,一张数据表可以有多个非聚集聚集索引,并且需要自己独立的存储空间。
两种索引设计的初衷都是为了便于快速的获取到数据页,提高查询性能。这就好比一本书需要加上目录一个道理。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2017-05-24 “墨菲定律”、“帕金森定理”和“彼德原理”