谈谈对数据库索引的认识

索引的概念

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



索引的作用

默认情况下,进行条件查询操作,就是遍历表,一条一条数据都带入条件。
引入索引,就是要通过引入其他的数据结构(比如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;

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

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

相关文章

清理ubuntu空间

最近ubuntu空间告急&#xff0c;急需清理一下。 首先是apt的清理&#xff0c;apt中会留存很多的下载和安装文件&#xff0c;此时就需要&#xff1a; 先查看&#xff1a; du -sh /var/cache/apt/archives然后清理&#xff1a; sudo apt-get clean清理不需要的内核&#xff1a;…

企业数据流动安全管理软件(深度解析文章)

企业数据重要性不言而喻&#xff0c;而同时数据的流动和共享也带来了安全风险&#xff0c;如何确保企业数据在流动过程中的安全性&#xff0c;也成为了企业需要面临的重要问题。 企业数据流动安全管理软件的主要功能是监控和管理企业数据的流动过程。 它能够对企业内部的数据…

launchctl及其配置、使用、示例

文章目录 launchctl 是什么Unix / Linux类似的工具有什么哪个更常用配置使用常用子命令示例加载一个 launch agent:卸载一个 launch daemon:列出所有已加载的服务:启动一个服务:停止一个服务:禁用一个服务:启用一个服务: 附com.example.myagent.plist内容有趣的例子参考 launch…

vb.net+zxing.net随机彩色二维码、条形码

需要zxing库支持ZXing.NET Generate QR Code & Barcode in C# Alternatives | IronBarcode 效果图&#xff1a; 思路&#xff1a;先生成1个单位的二维码&#xff0c;然后再通过像素填充颜色&#xff0c;颜色数组要通过洗牌算法 洗牌算法 Dim shuffledCards As New List(…

牛客NC278 删除链表中重复的结点【中等 链表 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef 这题有一次面试某团的第一道题 思考 链表的基本操作参考答案Java import java.util.*; /*public class ListNode {int val;ListNode next null;ListNode(int val) {this.v…

【Linux杂货铺】进程的基本概念

目录 &#x1f308;前言&#x1f308; &#x1f4c1;进程的概念 &#x1f4c2;描述进程-PCB &#x1f4c2; 查看进程 &#x1f4c2; 查看正在运行的程序 &#x1f4c2;杀死进程 &#x1f4c2;通过系统调用获取进程标识符 &#x1f4c2;通过系统调用创建进程 &#x1f…

MongoDB聚合运算符:$first

文章目录 语法使用定义文档顺序数组操作缺失值的处理 举例数据缺失的情况在$setWindowFields阶段中使用 $first聚合运算符返回分组中第一个文档指定表达式的结果&#xff0c;只有分组文档是有序的情况下才有意义。 $first可用于下列阶段&#xff1a; $bucket$bucketAuto$grou…

初阶结构体

在这篇文章中我们只讲一些结构体的一些基础的知识&#xff0c;后续会继续补充关于结构体的高阶知识。 1.结构体声明 1.1结构体的基本知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 结构可以用来描述复杂对象&#xff0c;在…

day10-SpringBootWeb案例-1

一、准备工作 1 需求&环境搭建 步骤&#xff1a; 准备数据库表(dept、emp)创建 springboot 工程&#xff0c;引入对应的起步依赖&#xff08;web、mybatis、mysql 驱动、lombok&#xff09;配置文件 application.properties 中引入 mybatis 的配置信息&#xff0c;准备对应…

CI/CD实战-gitlab代码仓库 2

gitlab安装部署 实验虚拟机最小需求&#xff1a;4g内存&#xff0c;4核cpu 下载源&#xff1a;Index of /gitlab-ce/yum/el7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 安装依赖性&#xff1a; 安装软件&#xff1a; 修改依赖性配置文件 重新自动化配置 登录…

如何在 iPhone 上使用蓝牙鼠标

iPhone 不支持使用传统的鼠标指针。 然而&#xff0c;有一个名为“AssistiveTouch”的功能可以在屏幕上模拟类似光标的指针。 启用它的方法如下&#xff1a; 打开 iPhone 上的“设置”应用程序。转到“辅助功能”。向下滚动并选择“触摸”。点击“辅助触控”。切换开关以打开 …

Rust 01.变量、类型、函数

转义输出&#xff1a; fn main() {let a 12;println!("a {{{}}}", a); } //a {12}type let is_true: bool true;println!("is_true {}", is_true);let is_false false;println!("is_false {}, {}", is_false, is_true);//char 在rust里面…

快速排序(数据结构)

1. 前言&#xff1a; 这两种排序经常使用&#xff0c;且在算法题中经常遇见。 这里我们简单分析讨论一下。 1. 快速排序 平均时间复杂度&#xff1a;O&#xff08;nlogn&#xff09; 最坏时间复杂度&#xff1a; O&#xff08;n^2&#xff09; 1.1. 左右向中遍历: 取最右侧4…

MiniGPT-5: 通过生成性视觉标记实现交错式视觉与语言生成

MiniGPT-5: Interleaved Vision-And-Language Generation via Generative Vokens 摘要 近年来&#xff0c;大型语言模型(LLM)在自然语言处理(NLP)领域的突破性进展引起了全球AI开发者的关注。这些模型在文本生成和理解方面设定了新的基准。然而&#xff0c;尽管在文本生成方面…

HarmonyOS NEXT应用开发—发布图片评论

介绍 本示例将通过发布图片评论场景&#xff0c;介绍如何使用startAbilityForResult接口拉起相机拍照&#xff0c;并获取相机返回的数据。 效果图预览 使用说明 通过startAbilityForResult接口拉起相机&#xff0c;拍照后获取图片地址。 实现思路 创建CommentData类&#…

Linux TCP参数——tcp_abort_on_overflow

tcp_abort_on_overflow 英文翻译理解&#xff1a;溢出中止 所以&#xff0c;溢出指的是什么溢出&#xff1f; Linux中会维护socket全连接队列&#xff0c;所以这里的溢出指的是全连接队列的溢出。 全连接队列是什么&#xff1f; 全连接队列指的就是TCP三次握手中的第三次握手…

腾讯云轻量应用服务器2核4G5M代表什么意思?

腾讯云服务器2核4G5M带宽配置是代表什么&#xff1f;代表2核CPU、4G内存、5M公网带宽&#xff0c;这是一款轻量应用服务器&#xff0c;系统盘为60GB SSD云硬盘&#xff0c;活动页面 txybk.com/go/txy 活动打开如下图&#xff1a; 腾讯云2核4G5M服务器 如上图所示&#xff0c;这…

sqllab第29-33通关笔记

29关知识点&#xff1a; 单引号闭合绕过联合注入 payload:id0%27unionselect1,2,database()%271报错注入 id1%27andextractvalue(1,concat(0x7e,database(),0x7e))%271下面就不演示了&#xff0c;上面给出了payload&#xff0c;感觉没有任何过滤信息&#xff0c;那个waf应该是…

嵌入式系统架构设计

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/136745118 一. 嵌入式系统硬件 1、传统嵌入式系统主要硬件包括&#xff1a; ● 微处理器&#xff1a;微控制器&#xff08;MCU&#xff09;&#xff0c;微处理器&#xff08;MPU&#xff09; ● 存储器…

HCIA——TCP协议详解

目录 1、TCP概念及协议头部格式 1.1TCP特点 1.2TCP协议协议头部格式 1.3字段进行介绍 1.3.1源端口和目的端口 1.3.2序号(seq) 1.3.3确认序号(ack) 1.3.4数据偏移 1.3.5标志位 1.3.6窗口 1.3.7校验和 1.3.8紧急指针 2、TCP的可靠性 2.1 TCP可靠性的保障 2.2排序机…