谈谈对数据库索引的认识

索引的概念

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。
可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。



索引的作用

默认情况下,进行条件查询操作,就是遍历表,一条一条数据都带入条件。
引入索引,就是要通过引入其他的数据结构(比如B+树),来加快查询的速度,减少遍历表的可能性



索引的使用场景

对某数据库表的某列或某几列创建索引时,考虑的因素:

  1. 数据量较大,且经常对这些列进行条件查询
  2. 该数据库表的插入操作,及对这些列的修改操作频率较低
  3. 磁盘空间足够,因为创建的索引会占用额外的磁盘空间

当满足以上条件时,可以对表中的这些字段创建索引,以提高查询效率。
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。


索引背后的数据结构

原有的用来查询的数据结构: 二叉搜索树(红黑树),哈希表


哈希表:只能查询key相等的情况,无法进行<(小于),>(大于)这样的范围查询.
原因:经过 hash 函数的映射,原来 key 之间的大小关系,不能反应到计算出来的 hash 值的大小关系,也无法决定下标的大小关系
结论:哈系表不适合作为数据库查询的数据结构


红黑树
(1)红黑树里面的元素是有序的,可以进行范围查询了,但是它在查找某些节点的效率不高
原因:
如下图所示:找左树最右节点的后继 => 即找节点22的后继:节点25
需要往父节点上一系列回溯,才能找到它
注:找右数最左节点的前驱也是一样的
此处可以通过"线索化"的方式来解决,但是要付出更多的存储空间,也是不合适的
在这里插入图片描述

(2)红黑树是二叉搜索树,当元素非常多的时候,就会使树的高度,变的比较高,树的高度越高,进行查询的效率就越低.
原因:
a) 高度每增加一层,比较次数就增加1
b) 数据库的数据/索引都是保存在硬盘上的.上述的每次比较,就都需要一次硬盘IO操作了
结论:红黑树不太适合于大规模在硬盘上管理数据的场景


B+ 树的前身:B 树的诞生

B树,本质上是一个N叉搜索树.
每个节点上可以存储多个元素,延伸出多个子树.
表示同样数量的数据,需要的节点数就少了,对应的树的高度也大大降低了.

B树结构模型如下图:
在这里插入图片描述

B 树的优势:

  1. 每个节点上的这些 key 是有序排列的,比较的时候可以直接二分查找.
  2. B树也会保证让其节点上保存的 key 不会太多,如果插入更多的元素,使 key 变多了,改节点分裂出更多的子树出来
  3. 多个数据,都是放在一块连续的存储空间上,进行比较的时候,一次硬盘IO就能读出整个节点,就可以直接完成上述比较 (进行多次比较,实际上只有一次硬盘IO

注:B 树 也被称为 B- 树

索引数据结构的最终形态:六边形战士 B+ 树 正式登场

B+ 树 是 B 树的升级版,同样的,B+ 树也是 N 叉搜索树

B+ 树结构模型如下图:
在这里插入图片描述
1)按照上述规则来排列数据, 此时叶子节点这一层,就包含了整个数据集合的全集
2)另外, B+树,会把叶子结点通过类似于链表这样的链式结构串起来。此时就可以通过上述链式结构非常方便的遍历整个表中的所有数据,同时也非常方便进行范围查询。比如,查询 id >= 5 and id < 9 此时进行的范围查询就非常简单高效

B+ 树相比于 B 树的优势:

  1. 非常方便进行遍历和范围查询

  2. 当前任何一次查询操作,最终都是要落到叶子节点完成的,所以,查询任何数据,经历的硬盘IO的次数都是一样的。这个时候,查询操作消耗的时间是稳定的;如果是B树的结构, 有的元素,直接在非叶子节点就查到了,IO次数更少,就会出现有些 key 查的快,有些 key 查的不快(IO次数有很大影响) 不稳定

  3. 由于叶子节点,是数据的全集,对应的非叶子节点中,都是重复出现的数据。就可以把表每一行的数据,最终都关联到叶子节点这一层.非叶子节点中只保存一个单纯的 key 值即可
    例子:student(id, name, classId, gender, score)
    此时,比如使用id这一列来做索引.这里B+树的非叶子节点,都只需要保存一个id这样的值就行了.到了叶子节点这里,每个叶子节点不光要保存 id,还要把后续的name, classld等信息也保存起来.


我们看到数据库的"表格"只是一个逻辑上的结构实际上底层的结构,就是这个B+树的结构,就会按照主键的索引的这个B+树的叶子节点来保存每一行的数据。
如果你的表,创建主键了,自然是通过你创建的主键的索引的B+树来组织所有行;如果你没创建主键, mysql其实生成了一个隐藏的主键,按照隐藏主键构造的树来组织。
这样组织之后,非叶子节点占用的空间就比较小(非叶子节点只存id)此时,非叶子节点就可以缓存到内存中(这份数据必然要在硬盘上也保存一份,为了提高查询速度,就可以把这部分结构放到内存中了)这样查询速度又大大提高了(非叶子节点中的比较不再收到硬盘IO的制约了)

注:B+树存在的前提,使用了innodb这个存储引擎,mysql支持多种存储引擎,不同的存储引擎使用的索引的数据结构是不同的.

针对哪个列创建索引,就是针对哪个列构建B+树.
主键索引的B+树,叶子节点是带有数据行的.其他的列的索引,叶子节点,则是主键id
针对非主键列进行索引查询,查到的结果是一个主键id,还需要去主键索引中再做一次查询(称为"回表")

针对索引列进行查询,就是从树根节点往下一层一层的查询
针对非索引列查询,就拿着最底下一层叶子节点,遍历链表就行了.


索引的使用

  • 查看索引
show index from 表名;

示例:查看班级表已有的数据

show index from class;
  • 创建索引
    对于非主键、非唯一约束、非外键的字段,可以创建普通索引
create index 索引名 on 表名(字段名);

示例:创建学生表中学生ID的索引

create index index_student_id on student(student_id);
  • 删除索引
drop index 索引名 on 表名;

示例:删除学生表中学生ID的索引

drop index student_id on student;

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

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

相关文章

27. 移除元素 (Swift版本)

题目描述 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出…

【蓝桥杯每日一题】填充颜色超详细解释!!!

为了让蓝桥杯不变成蓝桥悲&#xff0c;我决定在舒适的周日再来一道题。 例&#xff1a; 输入&#xff1a; 6 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1 输出&#xff1a; 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 2 2 1 1 1 2 2 2 1 1 2 2 2 2 1 1…

渐开线花键环规的几种加工方法

小伙伴们大家好&#xff0c;今天咱们聊一聊渐开线花键环规的几种加工方法。 渐开线花键环规是在汽车、摩托车以及机械制造工业应用非常广泛的一种检测量具。它属于是一种内花键齿轮&#xff0c;其精度和表面粗糙度要求都比较高。采用的加工方法也比较多&#xff0c;下面详细看…

Spring MVC文件上传配置

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 文件上传 Spring MVC文件上传基于Servlet 3.0实现&#xff1b;示例代码如下&#xff1a; Overrideprotected void customizeRegistration(ServletRegistration.Dynamic reg…

C语言-memcpy(不重复地址拷贝 模拟实现)

memcpy&#xff08;不重复地址拷贝&#xff09; 语法格式 在C语言中&#xff0c;memcpy 是一个标准库函数&#xff0c;用于在内存之间复制数据。它的原型定义在 <string.h> 头文件中。memcpy 的语法格式如下&#xff1a; c void *memcpy(void *destination, const voi…

2024全新返佣商城分销商城理财商城系统源码 全开源PHP+VUE源码

2023全新返佣商城分销商城理财商城系统源码 全开源PHPVUE源码 程序安装环境要求&#xff1a; nginx1.16 php7.2 mysql5.6 程序全开源PHPVUE源码 有需要测试的老铁&#xff0c;拿去测试吧

KKVIEW远程: 安卓免费远程控制软件

安卓免费远程控制软件&#xff1a;方便、实用且高效 在数字化日益增长的今天&#xff0c;远程控制软件正变得越来越重要。无论是在家庭环境还是工作环境中&#xff0c;它们都能为我们提供便利。特别是在移动设备上&#xff0c;如安卓设备&#xff0c;这种需求更为明显。幸运的是…

基于高斯模型的运动目标检测(车辆检测),Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

RTC协议与算法基础 - RTP/RTCP

首先&#xff0c;需要说明下&#xff0c;webrtc的核心音视频传输是通过RTP/RTCP协议实现的&#xff0c;源码位于src/modules/rtp_rtcp目录下&#xff1a; 下面让我们对相关的内容基础进行简要分析与说明&#xff1a; 一、TCP与UDP协议 1.1、TCP协议 TCP为了实现数据传输的可…

C到C++的敲门砖-2

文章目录 引用内联函数auto关键字基于范围的for循环指针空值nullptr后记 引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间。 所谓引用就是给变量起别名&am…

uwsgi+nginx+django 部署学习

收集静态文件及部署配置 DEBUG False STATICFILES_DIRS [os.path.join(BASE_DIR, "static"), ] STATIC_ROOT /data/static python3 manage.py collectstatic 收集静态文件&#xff0c;成功后可在STATIC_ROOT目录查看 安装依赖 pip3 install uwsgi django项目结…

浅谈如何自我实现一个消息队列服务器(1)——需求分析

文章目录 一、什么是消息队列&#xff1f;二、当下主流的消息队列(MQ)三、自我实现一个消息队列服务器的前期准备——需求分析3.1 核心概念3.2 broker server 核心概念3.2.1、虚拟主机&#xff08;Virtual Host&#xff09;3.2.2、交换机&#xff08;Exchange&#xff09;3.2.2…

Apache-Doris基础概念

OLAP数据库Doris 一、Doris架构二、基本概念1. Row & Column2. Partition & Tablet3. 建表示例&#xff08;1&#xff09;列的定义&#xff08;2&#xff09;分区分桶&#xff08;3&#xff09;多列分区&#xff08;4&#xff09;PROPERTIES&#xff08;5&#xff09;E…

stable diffusion webui 搭建和初步使用

官方repo: GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 关于stable-diffusion的介绍&#xff1a;Stable Diffusion&#xff5c;图解稳定扩散原理 - 知乎 一、环境搭建和启动 准备在容器里面搞一下 以 ubuntu22.04 为基础镜像&#xff0c;新建…

健身·健康行业Web3新尝试:MATCHI

随着区块链技术进入主流&#xff0c;web3 运动已经开始彻底改变互联网&#xff0c;改写从游戏到金融再到艺术的行业规则。现在&#xff0c;MATCHI的使命是颠覆健身行业。 MATCHI是全球首个基于Web3的在线舞蹈健身游戏和全球首个Web3舞蹈游戏的发起者&#xff0c;注册于新加坡&a…

保研|资讯|夏令营|3.31截止!香港城市大学市场营销学系首届学术暑期夏令营

香港城市大学市场营销学系首届学术暑期夏令营 1 项目简介 我们的博士项目致力为未来营销科学和工商管理学界培养一流学者和行业领袖。博士项目一般为期四到六年&#xff0c;允许本科生直接申请。课程包括实证分析模型&#xff0c;消费者行为研究&#xff0c;博弈微观模型&…

龙芯新世界系统(安同AOCS OS)安装Cinnamon桌面最新版6.0.4

龙芯的新世界系统安同AOCS OS是十分优秀的操作系统&#xff0c;处于纯社区方式运行&#xff0c;她的各组件更新得很及时&#xff0c;很多组件都处于最新的状态&#xff0c;给我们安装使用最新的开源软件提供了很好的基础。由于本人一直使用Cinnamon桌面环境&#xff0c;各方面都…

Docker 哲学 - 容器操作 (二)

命令行启动 参数键值之间可以使 " " 或者 空格 卷的挂载是在容器创建时指定的&#xff0c;不能在容器运行时再添加 当加上 --network-alias 设置同一网络下别名参数后 &#xff0c;inspect 该容器发现 会同步到 容器信息中 2、给容器打日志 docker logs 【-…

【数据结构】栈与队列

一、栈 1.基本概念 栈是只能在一段进行插入或者删除的线性表 出栈进栈 只能在栈顶进行 三个术语&#xff1a;栈底&#xff0c;空栈&#xff0c;栈顶 字面理解即可 栈的基本操作&#xff1a; 创 销 增 删 查 2.顺序栈的实现 &#xff08;1&#xff09;初始化 #define…

玩转C语言——数组初探

一、前言 通过前面的学习&#xff0c;我们已了解C语言的结构变量、分支结构和循环结构。今天&#xff0c;我们一起来认识C语言的另一知识点——数组。先赞后看&#xff0c;养成习惯。 二、数组概念 学习数组&#xff0c;我们要明白数组是什么。在我看来&#xff1a;数组是⼀组…