MySQL:索引

news2024/12/26 3:44:00

        索引,在MySQL中非常重要。它能提高数据库的性能,不用加内存,不用改程序,不用调sql,只要执行 正确的 create index ,查询速度就可能提高成百上千倍。

        但是,查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。

什么是索引?

索引,本质上属于“书的目录”,通过目录,就可以快速的找到某个章节对应的位置,索引的效果就是加快了查找的速度。

但是索引也提高了增删查的开销,此时进行增删改,就需要调整已经创建好的索引目录;

所以还提高了空间的开销,构建索引还需要额外的硬盘空间来保存。

查看索引:

show index from 表名;

 虽然我们没有手动创造一个索引,但是创建学生表的时候我们指定了id这一列是主键,表里如果有主键,主键这一列就会自动创建索引(有unique 和 foreign也会自动创建索引)

创建索引:

create index idx_student_name on student(name);

在这行代码中,我们创建了一个名为idx_student_name这样的索引,根据 名字 这一列来创建的索引

创建索引最好是在表创建之初就把索引给创建好,否则,如果是针对一个表中已经有很多很多记录的表来创建索引,是一个危险操作!

这个时候会吃掉大量的磁盘IO,花费很长的时间,并且在这段时间里数据库是无法被正常使用的。

索引就是为了加快查询的速度,但是并不是所有的情况加上索引就一定快

如果姓名有重复,重名特别多的情况下,那么索引就不一定能够提高查询的速度了。

例如针对像性别这样的列,或者是大学生管理系统中年龄这样的列加索引,是无法提高查找速度的。

关于代码优化:

我们把索引创建好了之后,不需要手动使用,查询的时候就会自动的来走索引。

SQL是通过数据库的执行引擎来进行执行的,这里面会涉及到一些优化操作,执行引擎会自动评估,哪种方案是成本最低,速度最快的。

具体的某一次查询,实际上是否在走索引,以及怎么走的,其实是不好预期的。

但是可以使用explain这个关键字,显示出查询过程中,具体的使用索引的情况~

同时代码优化不只是SQL有,C,C++,Java这一些主流的语言都有代码优化的能力。

我们所使用的编译器、虚拟机就会总和评估,可能就会在保持原有代码含义不变的基础上,对你的代码进行调整。

索引的数据结构(重点)

1.哈希表

哈希表是数据结构中最重要的结构,这也是工作和面试中出现频率极高的数据结构。

当我们用哈希表查找元素,时间复杂度是O(1),这是一个非常优秀的数据结构,但是哈希表不适合做数据库的索引。

原因在于:哈希表只能比较是否相等,而对于范围的数据查询却无能为力。但是数据库却经常要进行范围查询。

2.二叉搜索树

二叉搜索树的时间复杂度是O(N),并且这是考虑的最坏情况,是在单枝树的情况下(相当于一个链表)。

并且二叉搜索树好像可以进行范围查询了。但是数据库并没有使用二叉搜索树

二叉意味着当元素多了的时候,树的高度就会比较高,树的高度就决定了查询的时候元素的比较次数慧比较多。而查询次数又会跟硬盘读写挂钩,所以二叉搜索树也不适合来作为索引的数据结构。

3.N叉搜索树

N叉搜索树就是每个节点上有多个值,同时还有多个分支,这样操作树的高度就降低了。

其中的一种典型实现,叫做B树。

这样一看,这么多数据只用了2高度就完成了储存,这对于数据库的索引来说再适合不过了。

虽然总数据还是那么多,比较次数差不多,但是读写硬盘的次数减少了,让硬盘的占用大大降低了,因提高了速度。

4. B+树

B树已经可以比二叉搜索树更适合于做数据库的索引了,但是还不够。针对这里,又引进了B+树,这是对B树的进一步改进,可以这么说:B+树就是为了索引这个场景量身定做的数据结构。

 

比如查找 id > 3 and id < 10 这样的元素,B+树就能很好的实现。

1.B+树也是一个N叉搜索树,每个节点上可能包含N个key,N个key划分出N个区间,最后一个区间就相当于最大值。

2.父元素的key会在子元素中重复出现,并且是以最大值的姿态出现的~

 

例如,在左子节点中,父元素为8和15,那么子节点里面的元素就包含:小于8的元素、8

在右节点中,包含:8到15的元素,15

这样的重复出现,导致叶子结点包含了所有数据的全集。非叶子结点中所有的值都会在叶子结点中体现出来

3.会把叶子节点,用类似于链表的方式进行首尾相连

 这样的操作,好处有以下几点:

1.作为一个N叉搜索树,但是高度却很低,比较的时候硬盘的IO次数大大降低了

2.更适合进行范围查询

3.所有的查询都是落在叶子节点上的,无论查询哪个元素,中间比较的比较次数差不多,查询操作比较均衡

对于B树来说可能是可能是有的值查的快,有的值查的慢。但是在B+树,大家都是一样的速度。

4.由于所有的key都会在叶子结点中体现,因此非叶子结点不用存数据行,只要把所有的数据行给放到叶子节点上即可,非叶子结点中只需要存放索引的值(比如id)

查询的时候,会根据创建的依据(例如id)就会快速在非叶子节点上检索,然后找到所需要的一条记录。并且由于非叶子结点只存了id,意味着它占用的空间是非常小的,进一步降低了硬盘IO,提高了查询速度。

除此之外,有得表并不只有主键索引,别的非主键列,也有索引~

这种情况会构造另外一个B+树,B+树非叶子节点里面存都是这一列里面的key . (比如一堆学生姓名) 到了叶子节点这一层,不是存之前的完整的数据行,而是存主键id。使用主键列来查询,只要查一次B+树就可以了。如果是使用非主键列的索引来查询,则需要先查一遍索引列的B+树,再查一遍主键列的B+树(回表)。

 

到这里为止,索引的基础内容就介绍的差不多了,索引有一定难度,并且不好理解,需要反复观看~

 

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

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

相关文章

Lora模型训练-koya SS GUi

前提 现在大部分 AI 产品采用的的大模型(dreamboth),但是在产品的训练中也发现了不仅仅需要较大的内存还需要好的 GPU 成本较高,而且模型较大修改只能重新训练不能修改,为了解决这个问题开始推荐 lora 小模型时代.接下来讲解 lora 模型以及使用小模型(lora)的Koya.SS.GUI的流程…

LeetCode-031. 最近最少使用缓存

HashMap扩容&#xff1a;(30条消息) 代码优化 | 如何设置HashMap的初始值大小_hashmap指定初始值大小_死牛胖子的博客-CSDN博客 1、哈希表LinkedList 超出时间&#xff08;&#xff09; Collection(集合):容器,用于存放对象(引用类型。基本类型需要自动装箱) List(列表):元素…

正则表达式(一):基础命令及字符

正则表达式一-基础命令及字符 一、常用命令补充&#xff1a;1.grep&#xff1a;2.sort&#xff1a;3.uniq&#xff1a;快速去重4.tr&#xff1a;5.cut&#xff1a;6.split&#xff1a;文件拆分7.paste&#xff1a;合并文件8.例题应用&#xff1a; 二、正则表达式&#xff1a;1.…

UID和cookie的查找

1、首先在浏览器中输入www.weibo.cn(如图1)&#xff0c; 然后按回车键&#xff0c;打开微博&#xff08;如图2&#xff09;。 图1 图2 2、在上图空白处单击鼠标右键&#xff0c;在显示出的对话框中点击【检查】&#xff0c;如下图。 3、如下图&#xff0c;点击【网络】或者【N…

chatgpt赋能python:Python自定义函数:让编程更高效

Python自定义函数&#xff1a;让编程更高效 Python是一种非常流行的编程语言&#xff0c;它有很多强大的功能&#xff0c;包括自定义函数。Python的自定义函数可以让你编写自己的代码&#xff0c;并将其作为一个函数来使用。这在编程中非常有用&#xff0c;因为它可以让你将代…

java设计模式(十九)备忘录模式

目录 定义模式结构角色职责代码实现适用场景优缺点定义 备忘录模式(Memento Pattern) 保存一个对象的某个状态,以便在适当的时候恢复对象。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。备忘录模式属于行为型模式。 模式结构 角色职责 …

数据结构04:串的存储结构与KMP算法

前言 参考用书&#xff1a;王道考研《2024年 数据结构考研复习指导》 参考用书配套视频&#xff1a;4.1_1_串的定义和基本操作_哔哩哔哩_bilibili 特别感谢&#xff1a; Google Bard老师[解释KMP&#xff0c;修改BUG]、Chat GPT老师[修改BUG]、BING老师[封面图]~ 当我请求BI…

chatgpt赋能python:Python如何使用空行优化SEO

Python 如何使用空行优化 SEO 在网页排名算法中&#xff0c;空行的使用可以对网页的排名产生影响。在 Python 中&#xff0c;空行的使用也被用来优化代码和提高代码的可读性。本文将介绍如何在 Python 中使用空行来优化代码和优化 SEO。 空行的作用 在 Python 中&#xff0c…

【论文阅读】AlexNet: ImageNet Classification with Deep Convolutional Neural Networks

1. 简介 AlexNet是一个用于图像识别的卷积神经网络&#xff0c;其应用在ILSVRC比赛中&#xff0c;AlexNet所用的数据集是ImageNet&#xff0c;总共识别1000个类别 2. 网络结构 整体网络结果如下图所示&#xff0c;一共有8层&#xff0c;前五层是卷积层&#xff0c;后三层是全…

Kubernetes之pod

Kubernetes之pod 在通过docker运行程序时&#xff0c;我们通常会制作Dockerfile文件构建镜像。也可以基于某个镜像运行容器在容器中安装组件之后&#xff0c;再基于容器生成镜像 使用如下命令可生成镜像&#xff0c;想了解更多参数请添加–help docker build -f Dockerfile路…

(超超详!!)Linux进程间通信-----管道 + 共享内存详解

索引 通信背景管道匿名管道命名管道 共享内存基本概念共享内存如何管理共享内存的相关函数共享内存的删除共享内存的使用 通信背景 进程是具有独立性的,每个进程都有独立的PCB,独立的数据和数据结构,因此进程间想要交互数据,成本会非常高,但有时候需要多进程协同处理同一件事情…

java设计模式(十五)责任链模式

目录 定义模式结构角色职责代码实现适用场景优缺点 定义 责任链模式(Chain of Responsibility) 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有对象能够处理…

deque介绍

目录 简介&#xff1a; 初识deque deque的底层实现 deque插入 deque的operator[] deque的迭代器 deque的缺陷 与vector比的缺陷 与list相比的缺陷 deque的优势 简介&#xff1a; 这一节不会进行模拟实现&#xff0c;只会聊聊deque的底层 原因是我们学习deque是为了…

RabbitMQ中的AMQP协议与核心组成介绍

前言 在RabbitMQ中为了传输数据&#xff0c;使用的是基于TCP/IP协议构造的AMQP协议。RabbitMQ的核心组成部分包括&#xff1a;Server、Connection、Channel、Message、ExChange、Virtual Host、Bingings、Routing key、Queue AMQP协议 AMQP协议全称&#xff1a;Advanced Mes…

RK3588平台开发系列讲解(驱动基础篇)信号驱动 IO 实验

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、信号驱动 IO 简介二、实验程序2.1、应用程序2.2、驱动程序沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 信号驱动 IO 不需要应用程序查询设备的状态,一旦设备准备就绪,会触发 SIGIO 信号,进而调用注…

论文中文翻译——kAFL Hardware-Assisted Feedback Fuzzing for OS Kernels

本论文相关内容 论文下载地址——26th USENIX Security Symposium论文中文翻译——kAFL Hardware-Assisted Feedback Fuzzing for OS Kernels 文章目录 本论文相关内容前言kAFL&#xff1a;操作系统内核的硬件辅助反馈Fuzzing作者信息论文来源主办方信息摘要1 引言2 技术背景2…

系统U盘制作随记

随身系统U盘制作 最近花了好多时间&#xff0c;废了好多U盘才把这东西搞明白了。 主要是自己的笔记本问题比较多&#xff0c;用实验室的Hp机一下就弄好了。 用这篇博客总结一下自己&#xff0c;然后附上详细的流程以免大家踩坑。 Windows to Go 这个比较容易上手 1. 准备…

EIoT能源物联网在工厂智能照明系统改造项目的应用 安科瑞 许敏

【摘要】&#xff1a;随着物联网技术的发展&#xff0c;许多场所针对照明合理应用物联网照明系统&#xff0c;照明作为工厂的重要能耗之一&#xff0c;工厂的照明智能化控制&#xff0c;如何优化控制、提高能源的利用率&#xff0c;达到节约能源的目的。将互联网的技术应用到工…

MySQ基本操作详解

MySQL的基本操作 首先sql操作中的关键字的是大小写不敏感的&#xff0c;create 和CREATE是一样的。 1.库操作 1. 1查看数据库 show databases;show 和databases 之间有一个或者多个空格注意是databases而不是database结尾分号是英文形式&#xff0c;分号在SQL中是表示一行执…

第三节 循环结构

文章目录 1. while循环1.1 什么是循环?1.2 while 循环1.2.1 语法结构1.2.2 循环中的异类 1.3 while循环使用案例1.3.1 求1~100之间的和1.3.2 求1~100之间偶数之和1.3.3 循环中的"标志变量" 1.4 嵌套循环使用1.4.1 嵌套循环语法结构1.4.2 嵌套练习 1.5 知识扩展 --最…