索引的本质与数据结构

news2024/11/28 6:49:37

点击上方“追梦 Java”关注,一起追梦!

391aefdb6ec73401d43fec55234968b3.png

正确合理的创建索引是提升数据库查询性能的基础,因此针对数据库来说,索引是必须要掌握的。

1

数据库索引的本质

ff6934356e5d775eeaa0655085631c29.png

我们一说到索引,如果大家想到是一个类似于字典的目录,可以提高数据库查询的性能,那么这个理解还是太表面了,也就是说对索引的作用有了解,对它的本质还是不够了解。

数据库索引的本质是一种数据结构,是数据库管理系统(DBMS)中一个排序的数据结构,目的是为了提升对数据库表中的记录行的检索速度,以协助快速查询、更新数据库表中数据,而创建的一种数据结构。

实际上,建立索引会占用磁盘空间的索引文件,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录地址。

使用索引提升查询效率的 3 个特点:

1、索引能极大的减少存储引擎需要扫描的数据量,从而提升查询效率;

2、索引可以把随机 IO 变成顺序 IO,从而提升查询效率;

3、索引在进行分组、排序操作时避免使用临时表,从而提升查询效率;

2

MySQL 中 B+Tree 索引的实现方式

2d7e8a0b34a2bd9e09fc458f6473540a.png

1、Myisam 存储引擎中的实现

.frm 表定义文件:每一个存储引擎都有这个文件

.myd 数据文件:d 代表 data,数据库表中的数据保存在这个文件

.myi 索引文件:i 代表 Index,索引保存在这个文件

Myisam 引擎的数据文件与索引文件是分开的,在.myi 索引文件中无论是主键索引还是辅助索引,其叶子节点保存的是.myd 数据文件中的数据行的地址指针,因此 Myisam 引擎获取数据记录的过程是先从索引文件中拿到数据区的地址,然后再去数据文件中获取对应地址的数据返回给客户端。

2、Innodb 存储引擎中的实现

.frm 表定义文件:每一个存储引擎都有这个文件

.ibd 数据文件:数据库表中的数据保存在这个文件

在 InnoDB 存储引擎里,它是以主键为索引来组织数据的存储的,所以索引文件和数据文件是同一个文件,都在 .ibd 文件里面。

Innodb 以主键为索引来组织数据的存储,如果没有指定主键,那么 InnoDB 会默认增加主键索引,同时,叶子节点存放的是整张表的行记录数据,因为主键对应的行所有的字段都在叶子节点上存在,而且索引键值的逻辑顺序跟数据库表中的数据行内容存储顺序是一致,所以这种主键索引也叫聚集索引。 

Innodb 的辅助索引与聚集索引的区别在于辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键聚集索引键(即主键的值),当通过辅助索引来查询数据时,InnoDB 存储引擎会遍历辅助索引找到主键,然后再通过主键在聚集索引中找到完整的行记录数据。

InnoDB 会默认增加主键索引的规则

1、如果定义了主键(PRIMARY KEY),那么 InnoDB 会选择主键作为聚集索引;

2、如果没有定义主键,那么 InnoDB 会选择第一个不包含有 NULL 值的唯一索引作为主键索引;

3、如果唯一索引也没有定义,那么 InnoDB 会选择内置 6 个字节的 ROWID 作为默认的聚集索引,采用主键递增的策略生成。

Innodb 引擎的聚集索引把行记录数据与主键全部存起来的原因是考虑到用主键做查询的情况比较多,所以把所有的行记录聚集起来放到主键的叶子节点上。

Innodb 引擎的辅助索引用主键值而不用地址表示,主要原因是当数据变化的时候,如果用的是主键,不是地址的话,不用再维护辅助索引了。

后面将为大家深入讲解数据库的索引。

有用的话点个在a9d958066b553b39f0e280654efa5f2b.png

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

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

相关文章

Eclipse整合tomcat时要注意的几点

Eclipse整合tomcat时要注意的几点 1、安装目录及jdk 2、参数配置 注意:Arguments的配置,日志输出文件目录及java内存大小设置等,如下: -Dcatalina.base"E:\apache-tomcat-7.0.52" -Dcatalina.home"E:\apache-tomc…

【hadoop】Java API连接(操作)HDFS

Java API连接(操作)HDFS 直接连接遇到的问题设置执行的用户为root用户使用Java的-D参数来设置环境变量使用chmod的命令赋予权限修改参数配置 直接连接遇到的问题 直接运行下面的代码,会出现权限不够的问题 Test public void test1() throws…

Meta牵手Microsoft推出下一代Llama 2

官方消息 1、今天,我们将介绍 Llama 2 的可用性,这是我们的下一代开源大型语言模型。 2、Llama 2免费用于研究和商业用途。 3、Microsoft和 Meta 正在扩大他们的长期合作伙伴关系,Microsoft 是 Llama 2 的首选合作伙伴。 4、在技术、学术…

[SQL系列] 从头开始学PostgreSQL 自增 权限和时间

[SQL系列] 从头开始学PostgreSQL 事务 锁 子查询_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131841058上一篇介绍了事务,锁,子查询 事务有点像是原子操作,需要有完整性,要么全都完成了&#xff…

【目标跟踪】2、FairMOT | 平衡多目标跟踪中的目标检测和 Re-ID 任务 | IJCV2021

文章目录 一、背景二、方法2.1 Backbone2.2 检测分支2.3 Re-ID 分支2.4 训练 FairMOT2.5 Online Inference 三、效果3.1 数据集3.2 实现细节3.3 消融实验3.4 最终效果 论文:FairMOT: On the Fairness of Detection and Re-Identification in Multiple Object Tracki…

基于大模型的Text2SQL微调的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

(转载)基于 BP_Adaboost 的强分类器设计(matlab实现)

本博客的完整代码获取: https://www.mathworks.com/academia/books/book106283.html 1案例背景 1.1 BP_Adaboost模型 Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类。其主要步骤为:首先给出弱学习算法和样本空间(x,y),从样本空间中找出m组训练数…

Postman传递对象参数(包含有集合对象)

postman通常需要传递各式各样的参数,本文主要介绍了Postman传递对象参数(包含有集合对象),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 项目场景: postman通常需要传递各式各样的参数,这样的话,进行…

自然语言处理与词嵌入

1、词表特征 前面介绍过表征单词的方式是首先建立一个较大的词汇表(例如10000),然后使用one-hot的方式对每个单词进行编码。例如单词Man,Woman,King,Queen,Apple,Orange分别出现在词…

Docker数据管理和网络通信 dockerfile

Docker数据管理和网络通信 dockerfile 一:Docker 的数据管理1.数据卷2.数据卷容器 二:端口映射三:容器互联(使用centos镜像)四:Docker 镜像的创建1.基于现有镜像创建2&am…

C++入门先填坑

C是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C学习也有一定的帮助。 C入门先填坑系列主要内容会围绕以下方面 补充C语言语法的不足,以及C是如何对C语言设计不…

servlet Filter与spring的OncePerRequestFilter

servlet 规范 javax.servlet Filter 任何的servlet容器都要实现的,例如tomcat、undertow、jetty等等。类似于jdbc规范,制定好了一个约束,各家数据库厂商根据规范开发对应的驱动来实现访问自己的数据库。 spring 对于Filter的自定义实现 所…

NLP(六十)Baichuan-13B-Chat模型使用体验

2023年7月11日,百川智能正式发布参数量130亿的通用大语言模型Baichuan-13B-Base、对话模型Baichuan-13B-Chat及其INT4/INT8两个量化版本。   本文将介绍大模型BaiChuan-13B-Chat的使用体验,其HuggingFace网址为:https://huggingface.co/bai…

【C语言day02】

转义字符 \\ 表示字符\,\123表示字符{,\t表示制表符,这些都是一个字符宏只是替换 替换后NUM的样子是(211)*21/2常量指针与指针常量 const和* 来区别,如果是const * 这样的顺序就是常量指针,所以说他的本质是指针&am…

uni-app:请求后端数据uni.request

完整代码: onLoad() {uni.request({url: getApp().globalData.position Produce/select_employee,data: {username: getApp().globalData.username,},method: POST,dataType: json,success: res > {this.employee_name res.data.info.employee_name;// consol…

uniapp 之 微信小程序、支付宝小程序 对于自定义导航栏的不同

目录 前言 微信小程序 代码 支付宝小程序 首页配置文件 二级菜单页面 配置 总结 不同 相同 前言 小程序都是 uni-app 写的 不是原生 微信小程序 代码 pages.json文件中配置 重点: "navigationStyle": "custom", // 导航栏样式…

安卓开发日记问题记录(隐藏标题栏中的应用名称)

当我们设置了显示标题栏,应用名也会显示出来,这对设置标题栏内容很不方便 可以在activity里的onCreate部分设置这句代码隐藏APP名字 getSupportActionBar().setDisplayShowTitleEnabled(false);或者改变它 getSupportActionBar().setTitle("new …

疲劳驾驶检测和识别1: 疲劳驾驶检测和识别数据集(含下载链接)

疲劳驾驶检测和识别1: 疲劳驾驶检测和识别数据集(含下载链接) 目录 疲劳驾驶检测和识别1: 疲劳驾驶检测和识别数据集(含下载链接) 1. 前言 2. 疲劳驾驶类别说明 3. 疲劳驾驶检测数据集: (1)Drowsy-Driving-Det1 …

hadoop安全保护机制(kerberos + ldap)

信息安全理论: CIA模型:机密性、完整性和可用性 CIA模型能够帮助建议一些信息安全原则,但该模型并不是一个需要严格遵守的规则 hadoop平台可能设计多个CIA模型组件,也kennel一个也不涉及 机密性: 信息只应该被期望的…

高压放大器的增益和偏压是什么意思

高压放大器是一种广泛应用的电子元器件,主要用于放大高压信号和驱动负载等方面。在实际应用中,了解高压放大器的增益和偏压是非常重要的,下面安泰电子将详细介绍它们的意义和作用。 高压放大器的增益 增益是指放大器输入信号与输出信号之间的…