索引能优化查询,那么谈谈索引的优点和缺点?索引原理

news2024/11/15 13:55:48

面试必备:索引能优化查询,那么谈谈索引的优点和缺点?索引原理

简述:

优点:

第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能

缺点:

第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间

就会更大。

第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

索引的原理

​ 想要理解索引原理必须清楚一种数据结构「平衡树」(非二叉),也就是b tree或者 b+ tree,重要的事情说三遍:“平衡树,平衡树,平衡树”。当然, 有的数据库也使用哈希桶作用索引的数据结构 , 然而, 主流的RDBMS都是把平衡树当做数据表默认的索引数据结构的。

​ 索引是为检索而存在的,就是说索引并不是一个表必须的。表索引由多个页面组成,这些页面一起组成了一个树形结构,即我们通常说的B树, 首先来看下表索引的组成部分:
​ 根极节点,root,它指向另外两个页,把一个表的记录从逻辑上分成非叶级节点Non-Leaf Level(枝),它指向了更加小的叶级节点Leaf Level(叶)。根节点、非叶级节点和叶级节点都位于索引页中,统称为索引叶节点,属于索引页的范筹。这些“枝”、“叶”最终指向数据页Page。根级节点和叶级节点之间的叶又叫数据中间页。根节点对应了sysindexes表的Root字段,记载了非叶级节点的物理位置(即指针);非叶级节点位于根节点和叶节点之间,记载了指向叶级节点的指针;而叶级节点则最终指向数据页,这就是最后的B树。

​ 数据库是怎样访问表数据的:

第一:没有创建任何索引的表。
这种表我们称为堆表,因为所有的数据页都是无序的,杂乱无章的,在查询数据时,需要一条一条记录查询,有时第一条记录就能找到,最坏的情况是在最后一条记录中查找到,但是千万不要认为SQL此时查找到数据后会当成结果立即返回,SQL即使查找到了记录,也会将所有数据遍历一次,这能从最终的执行计划中得知,就是平时说的表扫描,对于没有索引的表也能查询,就是效率会特别低,如果数据量稍大的话。

问题:SQL是如何得知表没有索引呢?
SQL在接到查询请求的时候,会分析sysindexes表中索引标志符(INDID: Index ID)的字段的值,如果该值为0,表示这是一张数据表而不是索引表,SQL就会使用sysindexes表的另一个字段FirstIAM值中找到该表的IAM 页链也就是所有数据页集合。至于什么是IAM,大家可以网上搜索下。

第二:访问创建有非聚集索引的表。
非聚集索引可以建多个,形成B树结构,叶级节点不包含数据页,只包含索引行。如果表中只有非聚集索引,则每个索引行包含了非聚集索引键值以及行定位符(ROW ID,RID),他们指向具有该键值的数据行。RID由文件ID、页编号和在页中行的编号组成。当 INDID的值在2-250之间时,说明表中存在非聚集索引页。SQL调用ROOT字段的值指向非聚集索引B树的ROOT,查找与被查询最相近的值,根据这个值找到在非叶级节点中的页号,在叶级节点相应的页面中找到该值的RID,最后根据这个RID在Heap中定位所在的页和行并返回到查询端。
上篇文章的cityid上建立了非聚集索引,执行Select * From student Where cityid=’0101’时,查询过程是:
1:在sysindexes表查询INDID值为2,说明有非聚集索引;
2:从根出发,在非叶级节点中定位最接近0101的值(枝节点),查到其位于叶级页面的第n页;
3:在叶级页面的第n页下搜寻0101的RID,其RID显示为N∶i∶j,表示cityid字段中名为0101的记录位于堆的第i页的第j行,N代表文件的ID值。
4:在堆的第 i页第j行将该记录返回给客户端。

下图可做参考:
image-20230718211626182

第三:访问创建有聚集索引的表。
聚集索引中,数据所在的数据页是叶级,索引数据所在的索引页是非叶级。原理和上述非聚集索引的查询差不多,由于记录是按聚集索引键值进行排序,即聚集索引的索引键值也就是具体的数据页。这种情况比起非聚集索引要简单很多,因为比非聚集索引少了一层节点查询。
上篇文章的username字段上建立了聚集索引,此时执行Select* From student Where username=’1’时,查询过程是:
1:在sysindexes表查询INDID值为1,说明表中建立了聚集索;
2:从根出发,在非叶级节点中定位最接近1的值(枝节点),再查到其位于叶级页面的第n页;
3:在叶级页面第n页下搜寻值为1的条目,而这一条目就是数据记录本身;
4:将该记录返回客户端。
下图可做参考:

image-20230718211638274

第四:怎样访问既有聚集索引、又有非聚集索引的数据表:
username字段上建立了聚集索引,cityid上建立了非聚集索引,当执行Select * From student Where cityid=’0101’时,查询过程是:
1:在sysindexes表查询INDID值为2,说明有非聚集索引;
2:从根出发,在cityid的非聚集索引的非叶级节点中定位最接近0101的条目;
3:从上面条目下的叶级页面中查到0101的逻辑位置,是聚集索引的指针;
4:根据指针所指示位置,进入位于username的聚集索引中的叶级页面中找到0101数据记录;
5:将该记录返回客户端。

通过上面数据库访问索引的原理,我们就很容易解释聚集索引与非聚集索引的区别了,原理都一样,关键看什么场合应用什么索引了,下一篇我来总结一些不同场合最适合采用什么样的索引,不对之外多多指点。

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

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

相关文章

工程设计施工3D模型素材下载,全套1000+免费获取

在建筑设计和施工过程中,3D模型数据是至关重要的。设计师和工程师需要依赖高质量的3D模型数据进行方案优化、细节设计、施工规划和质量控制。因此,如何下载高质量的3D模型数据成为了一个重要的问题。 今天给大家免费提供一个“设计、施工3D模型数据下载…

推荐几个不错的免费配色工具网站

1. Paletton专业的配色套件,提供色轮理论及调色功能。可查看配色预览效果。 网站:http://paletton.com 2. Colormind一个基于机器学习的智能配色工具。可以一键生成配色方案。 网站:http://colormind.io 3. Adobe ColorAdobe官方的配色工具,可以从图片中取色,也可以随机生成配色…

ModStartCMS v6.9.0 后台多标签改进,主题色自动切换修复

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议,免费且不限制商业使用。 功能特性 丰富的模块市…

docker安装MySQL集群(一主一从)

目录 docker安装MySQL集群(一主一从)前菜测试MySQL 集群安装master容器slave容器master容器配置主从赋值测试 docker安装MySQL集群(一主一从) 前菜测试 1、拉取mysql5.7的镜像到本地 [rootaliyun ~]# docker pull mysql:5.72、…

优思学院|丰田公司的精益生产为什么让人敬佩?

因为丰田精益生产方式的成功不是偶然,它历经了50多年,从员工的教育训练着手,使他们能运用非常严格的问题解决程序,采用科学方法,针对各项活动、流程及制度不断地加以评估、检测与改进而自然形成的。事实上,…

【阿Q送书第四期】好书推荐《重构的时机和方法》

文章目录 背景概念介绍案例目录购书 送书规则 背景 最近公司正在组织 Code Review ,看看之前为了赶项目写的代码,真的是一言难尽。所以想趁同事审查我的代码之前做点“小动作”,没错,我想说的就是“代码重构”。 对于工作时间较…

css设置背景图片和边框背景

介绍一个网站,在这个网站里可以找到各种好看的背景图片和边框图片。 数据大屏 (代码是reactts,使用时请自行转换) 一:设置页面背景图片 css部分 .productionBoard {width: 100%;height: 100%;padding: 0 2rem;box-si…

高效梳理商业模式,3个免费的精益画布模板网站!

精益画布是一种能够帮助创业者快速开发商业模式的工具,它广泛应用于初创公司、企业创新、新产品发布等领域,并且精益画布可以帮助创业者系统地归纳商业模式,并从中找到新的商业机会。本文将向大家介绍3款免费的精益画布模板网站,这…

SFP3012-ASEMI快恢复二极管参数、规格、尺寸

编辑:ll SFP3012-ASEMI快恢复二极管参数、规格、尺寸 型号:SFP3012 品牌:ASEMI 芯片个数:2 芯片尺寸:102MIL*2 封装:TO-247 恢复时间:65ns 工作温度:-40C~175C 浪涌电流&am…

37.Vue生命周期-挂载流程

36.Vue引出生命周期_未来音律的博客-CSDN博客下面绿色框中的是Vue实例,红色框中的是具体的逻辑,而且最主要的是红色框中的还在操作绿色框中的数据。这是因为在定时器里,我们修改了data中的数据opacity,而Vue有这样的承诺&#xff…

MTK 进META的两种方式

1. Preloader进meta: 开机情况下:先发adb reboot meta进入Preloader,然后再进META 2. 开机后直接进meta

yolov5训练自己的数据集 以训练yolov5识别香烟为例

创建数据集目录 在YOLOv5根目录下创建mydata文件夹(名字可以自定义),目录结构如下,将之前labelImg标注好的xml文件和图片放到对应目录下 mydata …images # 存放图片 …xml # 存放图片对应的xml文件 …dataSet #之后会在Main文件…

JAVA毕业设计091—基于Java+Springboot+Vue的宠物领养系统(源代码+数据库+14000字论文)

基于JavaSpringbootVue的宠物领养系统(源代码数据库14000字论文)091 一、系统介绍 本项目前后端分离 本系统分为管理员、用户两种角色 用户角色包含以下功能: 登录、注册、首页、宠物喂养、流浪宠物救助、宠物喂养点、丢失宠物查看、流浪宠物救助站、宠物论坛、…

Appium+python自动化(二十五)-获取控件ID(超详解)

简介 在前边的第二十二篇文章里,已经分享了通过获取控件的坐标点来获取点击事件的所需要的点击位置,那么还有没有其他方法来获取控件点击事件所需要的点击位置呢?答案是:Yes!因为在不同的大小屏幕的手机上获取控件的坐…

实战项目——基于多设计模式下的同步异步日志系统

系列文章目录 1.项目介绍 2.相关技术补充 3.日志系统框架 4.代码设计 5.功能测试 6.性能测试 文章目录 目录 系列文章目录 1.项目介绍 2.相关技术补充 3.日志系统框架 4.代码设计 5.功能测试 6.性能测试 文章目录 前言 一、项目介绍 二、开发环境 三、核心技…

企业博客资讯如何高效运营起来?

运营一个高效的企业博客资讯需要综合考虑多个因素,包括内容策划、发布频率、优化推广、互动反馈等。下面将从这些方面介绍如何高效运营企业博客资讯。 如何高效运营企业博客资讯 内容策划 首先,需要制定一个明确的内容策略。确定博客的定位和目标受众…

亚马逊云科技纽约峰会,充分释放数据价值和生成式AI的潜力

生成式AI将深刻改变每个公司的运营方式,标志着人工智能技术发展的新转折点。亚马逊云科技昨日在纽约峰会上宣布,推出七项生成式AI新功能,进一步降低了生成式AI的使用门槛,让无论是业务用户还是开发者都能从中受益。借助这些新功能…

Packet Tracer – 使用 CDP 映射网络

# Packet Tracer – 使用 CDP 映射网络 ## 地址分配表 设备 接口 IP 地址 子网掩码 本地接口和互联邻居 Edge1 G0/0 192.168.1.1 255.255.255.0 G0/1 - S1 S0/0/0 S0/0/0 - ISP Branch-Edge S0/0/1 209.165.200.10 255.255.255.252 S0/0/1 – ISP Branch…

window下运行sh脚本/Linux命令

安装Git 首先找到git安装官方网址,Git的官方网址如下所示 https://git-scm.com/download/win 选择合适的Git版本安装即可。 一般一直点击install即可,注意环境变量的environment path的复选框点击。具体操作以及成果标志如下博客所示。 Windows 命令…

「VS」常见提示图标含义

✨博客主页何曾参静谧的博客📌文章专栏「VS」Visual Studio📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C」C/C程序设计「Win」Windows程序设计「算法」数据结构与算法「File」数据文件格式 目录 VS官网…