“手撕”MySQL的索引

目录

二、索引的作用

三、索引的缺点 

四、如何使用索引

查看索引:

创建索引: 

 ​编辑

删除索引:

五、索引的底层原理

那什么是B树,什么是B+树呢? 

B+树的好处:

 总结:


一、什么是索引

索引(index),在其他语言中,我们管索引叫下标,但是在MySQL中有点不一样,我们可以理解为目录!这些索引保存着我们的数据地址。

就像我们新华字典一样,如果我们想找一个字,我们可以通过拼音目录,部首目录等等,非常的快!

二、索引的作用

 就是来加快查询速度,为什么需要加快查询的速度呢?

答:比如我们在select中where一个条件,我们有大量的数据需要查询,如果一条一条遍历着去查询,那么时间复杂度将是O(N)。

O(N)看起来不大,但是它和我们数据结构中的O(N)不大一样,为什么呢?

因为在数据结构中是利用内存来遍历的,但是MySQL却是利用硬盘来读的而硬盘的速度非常慢,甚至比内存慢个几千倍。这就非常浪费时间,非常消耗咱们数据库的资源

 这时候我们就需要索引来帮忙了。例如我们select * from stduent where id=5:

无索引:我从最开始第一个开始遍历,一个一个遍历,不是的话就pass掉,不打印,直到我遇到了id=5,才打印出来。

有索引:我通过一种数据结构叫B+树,直接找到id=5,直接打印!

所以我们发现:索引可以大大减少我们的时间! 

三、索引的缺点 

好东西肯定是需要付出一些代价的,不可能十全十美~~

1)加索引需要耗费一些空间

但是对于后端开发来讲,这甚至不算什么,存储空间不够加硬盘就好啦~~若加硬盘话不够的话,还可以加机器~~

2) 加了索引,可能会影响”增删改“的效率

对于增删改可能会变快,也可能会变慢,也可能不变~~

比如 delete * from student where id=5;来说,确实会变快,因为少了很多遍历,

但是同时,”增删改“是需要同步更新维护索引的,需要调整。

在业务中,查询的频率比“增删改”高很多,所以这不算什么问题~~

但,上述两个问题不算什么问题,总的来说:利大于弊。

四、如何使用索引

值得注意的是:

创建主键约束(primary key)、唯一约束(unique)、外键约束(foreign key)时,会自动创建 对应列的索引。

假设我有student这个表:student(id,sn,name,qq_mail,classes_id)

查看索引:

show index from 表名;

创建索引: 

create index 索引名 on 表名(字段名);

 

创造索引其实是一个危险的操作!

对于数据量比较小(几万,几十万)创造索引,没什么危险的,

但是对于数据量特别大的(上千万等)创建索引,会触发大量的硬盘OI,就可能会卡死。

删除索引:

只能删除咱自己创造的索引,不能删除系统自动生成的索引。 

drop index 索引名 on 表名;

 

五、索引的底层原理

 索引用到的数据结构,其实是B+树(念做B加树)。它相当于B树,也可以叫做B-树(念做B树!不叫B减树)的plus版本。

B+树甚至可以说是为了数据库量身定做的数据结构,因为除了数据库甚至想不到B+树的其他用法~~

为什么不用其他数据结构呢,比如二叉搜索树,或者哈希表? 

1)二叉搜索树,最大的问题在于“二叉”当腰保存的元素多的时候,就会使整个树的高度变得比较高,它会有很多个节点,数据库是由硬盘读取的,每比较一次,都是很费时间的。

2)哈希表,最大的问题在于,只能进行“相等‘查询,无法进行>  <这样”范围查询“,也无法进行like这样的模糊查询。

那什么是B树,什么是B+树呢? 

B树:就是一个节点里面有多个数(二叉树一个节点只有一个数),假设一个节点有N个key值,它会划分出N+1个区间。这样就可以降低树的高度,从而减少节点的个数。这样就可以节省很多时间了。

问题:既然每个节点的数量多了,比较的次数不就多了吗,总次数还是不变,为什么会减少时间呢?

答:注意的是,这里是硬盘读取,硬盘一次读取一个节点(一个节点有多个数)!所以只要节点数量少,硬盘读取的次数就能减少,自然而然时间也会减少了。接下来的比较是在内存中比较的,也会比较快~~

B+树:B树的plus版本。 区别是:N叉搜索树,每个节点上包含N个key值,划分N个区间,上一个节点里面的  每一个数  都会  “下沉”  成为下一个节点的最后一个数。直到最后一层,他们会前后串起来,形成一个链表,就是一个数据全集,里面会存储数据库里面的数据,就像柳树的柳一样。

查询思路:

比如,上述的图是id的B+树,我要查id=3的数据,MySQL会查3在8和15的哪里,在8的左边,再查在2和5和8的哪里,在2和5的中间,到第3层,就查到id=3的数据了。最后一层就像柳树的柳枝一样,数据都挂在树枝上面。

 那重复出现的数据不会太占内存吗?

答:不会,简直是微乎其微。也就一个数字下沉了而已,假设我有1000w个数字下沉,一个数字int为4个字节,也就是4000w个。

记住:kb->thousand(千),mb->million(百万),gb->billion(十亿),也才40个million,40MB而已。

而且这只是个数字,并不像最后一层一样挂数据。但是好处却是非常大的。

B+树的好处:

1)N叉搜索树,高度比较低,节点少,此时硬盘IO次数就比较少

2)叶子节点是全集,并且用链表结构链接,非常便于范围查询

3)B+树,所有的查询都是要落到叶子节点上完成的,任何一次查询,经理的IO次数和比较次数都是差不多的,查询的开销稳定

4)叶子节点存储key值和数据,非叶子节点只存储key值,空间耗费小

 总结:

1)索引是啥,解决啥问题

索引相当于书的目录,能够提高查询的速度

2)索引付出了什么代价

a)需要更多的存储空间

b)肯会影响增删改的效率(不一定会影响)整体来说,索引的利大于弊

3)如何使用sql操作索引,是否有注意事项

a)show index from 表名;查看索引(主键,外键,unique会自动生成索引)

b)create index 索引名 on 表名(列名):给指定列创建索引

c)drop index 索引名 on 表名:删除索引

索引是针对列来常见的,后续查询的时候,查询条件使用的列和索引列匹配,才能索引生效,提高效率。针对一个比较大的表,创建/删除索引,是非常危险,可能会出发大量的硬盘IO,八机器搞挂了。

4)索引背后的数据结构->B+树特点和优势

特点:

a)N叉搜索树,每个节点上包含N个key值,划分N个区间

b)每个父节点中的元素,都会下沉到子节点中,作为该子节点中,作为该节点中最大值的角色来存在

c)叶子接待你这一层就构成了数据集合的全集

d)使用类似于链表职责与的结构,把叶子节点串起来

优势:

a)N叉搜索树,高度比较低,降低了硬盘IO次数

b)范围查询非常方便&高效

c)所有查询都洛到叶子节点上,开销非常稳定,容易预估成本

d)叶子节点存储key值和数据,非叶子节点只存储key值,空间耗费小(也可以加载在内存中进一步减少时间)

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

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

相关文章

C语言的周末小练习(贰)

周末小练习&#xff1a; 5、输入身高和体重&#xff0c;计算BMI指数(BMI w/(h*h))。 #include <stdio.h>int main() {float w,h,BMI;/*printf("请输入体重\n");scanf("%f",&w);printf("请输入身高\n");scanf("%f",&h…

vue3 快速入门 (五) : Flex布局

1. 如何变成Flex布局 变成Flex容器&#xff0c;只需在容器布局的节点的CSS中&#xff0c;增加display : flex .mylayout {/* 省略了其他代码 */display: flex; }2. flex direction : 方向 row : 以行排列 row-reverse &#xff1a; 以行反向排列 column &#xff1a;以列排列…

Matlab编程资源库(11)多项式计算

一、多项式的四则运算 1&#xff0e;多项式的加减运算 2&#xff0e;多项式乘法运算 函数conv(P1,P2)用于求多项式P1和P2的乘积。 这里&#xff0c;P1、P2是两个多项式系数向量。 3&#xff0e;多项式除法 函数[Q,r]deconv(P1,P2)用于对多项式P1和P2作除法运算。其中Q返回多项…

【前端 09】JavaScript中的对象与JSON

JavaScript中的对象与JSON 在JavaScript中&#xff0c;对象和JSON&#xff08;JavaScript Object Notation&#xff09;是两个紧密相连但又有区别的概念。它们都在数据处理和交换中扮演着重要角色。本文将详细讲解JavaScript中的自定义对象以及JSON对象的基本概念、格式、用法…

基于微信小程序+SpringBoot+Vue的教务管理系统(带1w+文档)

基于微信小程序SpringBootVue的教务管理系统(带1w文档) 基于微信小程序SpringBootVue的教务管理系统(带1w文档) 在目前的情况下&#xff0c;可以引进一款基于web的高校教务管理系统这样的现代化管理工具&#xff0c;这个工具就是解决上述问题的最好的解决方案。它不仅可以实时完…

python拼接字符串方法

文章目录 1. 使用加号&#xff08;&#xff09;2. 使用str.join()方法3. 使用格式化字符串&#xff08;f-strings, % 操作符, .format() 方法&#xff09;4. 使用列表推导式和join()结合 性能对比 在Python中&#xff0c;字符串拼接是将两个或多个字符串合并成一个新字符串的过…

生成RSA公钥的n值

简介&#xff1a;RSA算法是一种非对称加密算法&#xff0c;与对称加密算法不同的是,RSA算法有两个不同的密钥,一个是公钥,一个是私钥。 原理是&#xff1a;根据数论&#xff0c;寻求两个大素数比较简单&#xff0c;而将它们的乘积进行因式分解却极其困难&#xff0c;因此可以将…

【leetcode 详解】生成特殊数字的最少操作【中等】(C++思路精析)

题目见下&#xff1a; 测试数据: 解题思路笔记&#xff1a; 最初拿到这道题是很蒙的&#xff0c;联想不到什么数据结构的模型&#xff08;肯定是笔者积累太少了&#xff09;&#xff0c;甚至惯性地想怎么实现“删除数字”的操作&#xff1a;在原字符串中抽出一个字符然后将剩…

VS code 与Pycharm 的使用区别(个人)

注明&#xff1a;本文从这开始VS code简称VS&#xff0c;Pycharm简称PY 安装包大小 VS:PY 1:0 安装后实际大小 vs py VS:PY 2:0 界面ui&#xff08;简易&#xff09; vs py VS:PY 2:1 启动速度 VS:PY 3:1 注&#xff1a;以上为个人测评&#xff0c;无特殊意图

为什么AI会一本正经地胡说八道

泛泛地说&#xff0c;AI一本正经地胡说八道的原因可以归结为&#xff1a;AI的理解能力受到其训练数据和算法的限制&#xff0c;如果问题表达不清晰或者背景信息不足&#xff0c;AI可能会产生错误的推理或输出&#xff1b;AI语言模型本质上是基于统计学习和模式匹配的&#xff0…

第一个设计模式——单例模式

目录 一、特点&#xff1a; 二、实现单例模式步骤 三、饿汉式 四、懒汉式 五、双重检查锁 六、静态内部类 七、枚举 八、可能被反序列化和反射破坏什么意思&#xff1f; 九、如何解决呢&#xff1f; 一、特点&#xff1a; 唯一性&#xff0c;单例模式确保程序中只有一…

数据结构 -- 算法的时间复杂度和空间复杂度

数据结构 -- 算法的时间复杂度和空间复杂度 1.算法效率1.1 如何衡量一个算法的好坏1.2 算法的复杂度 2.时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3常见时间复杂度计算举例 3.空间复杂度4. 常见复杂度对比 1.算法效率 1.1 如何衡量一个算法的好坏 如何衡量一个算法…

我在高职教STM32——EXTI之外部按键中断(1)

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助CSDN平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分…

人工智能学习①

LLM背景知识介绍 大语言模型 (LLM) 背景 用于理解和生成人类语言&#xff0c;能够处理诸如文本分类、问答、翻译和对话等多种自然语言任务。 语言模型 (Language Model, LM) &#xff1a;给定一个短语&#xff08;一个词组或者一句话&#xff09;语言模型可以生成&#xff0…

Oat++ 后端实现跨域

这里记录在官方的例子中&#xff0c;加入跨域。Oat Example-CRUD 在官方的例子中&#xff0c;加入跨域。 Oat Example-CRUD 修改AppComponent.hpp文件中的代码&#xff0c;如下&#xff1a; #include "AppComponent.hpp"#include "controller/UserController…

idea-springboot后端所有@注释含义汇总-持续更新!

&#xff08;1&#xff09;启动类 ①SpringBootApplication 出现这个代表这个就是整个程序的入口&#xff0c;是运行的开始位置 &#xff08;2&#xff09;Dao层 ①Repository 作用就是声明自己这个为bean文件&#xff08;每一个controller都是一个bean文件&#xff09;&am…

blender顶点乱飞的问题解决

初学blender&#xff0c;编辑模式下移动某些顶点&#xff0c;不管是移动还是滑动都会出现定点乱飞的问题&#xff0c;后来才发现是开了吸附工具的原因&#xff01;&#xff01;&#xff01;&#xff01; 像下面这样&#xff0c;其实我只是在Z轴上移动&#xff0c;但是就跑的很…

Anaconda目录

安装目录 Anaconda 在默认情况下会安装到 C:\ProgramData\Anaconda3&#xff0c;而 conda 环境和包会安装在 C:\Users\username\.conda\ 目录下。 备注&#xff1a;我是在windows下安装 的Anaconda。我的安装目录是C:\Program Files\Anaconda3 pkgs目录 在以上两个目录下都有…

CH571F基于官方模版创建工程

直接使用MounRiver创建的工程只有最简单的串口和GPIO功能&#xff0c;其他PWM和SPI等驱动基本上都有&#xff0c;但蓝牙和USB只有参考官方的示例来&#xff0c;全部自己写属实有点麻烦了&#xff0c;而且还需要添加BLE的库。下面就简单基于官方的示例工程创建我们自己的工程。 …

抓包工具——wireshark的使用

​ 什么是wireshark wireshark是一个数据包捕捉程序。和linux下的tcpdump&#xff0c;以及sniffer&#xff0c;Fidder等软件功能类似。按理说&#xff0c;我们的计算机中的网卡设备只会将发给本机的数据包传输到上层进行解析&#xff0c;而其他的数据包会进行丢弃&#xff0c;…