谈谈关于mysql索引的理解

news/2024/10/11 9:24:53/
索引

我们在学习java中用来表示数组的下标例如定义一个变量int i 这就表示一个索引,因为索引的英文单词是index,索引也可以称为是书的目录,它可以方便我们查询自己所需要的内容,通过索引我们可以快速找到自己的需求.此时引出了索引的概念,在数据库中.

关于索引的相关操作

有了索引的概念,我们就可以通过使用索引去查询我们的需求,在数据库中可以通过使用unique 和

primary key, foreign key.自动对一个表的列创建索引.当然我们也可以手动的去创建一个索引,

使用索引进行查询

当我们使用索引进行查询时,一定要确保这列有索引在进行查询,这样才会提高查询效率,如果牛头不对马尾,例如name列有索引,id列没有索引,但是你对id列进行查询,那么就跟select的效果一样,遍历整个列,时间复杂度为O(N),这个是在硬盘上的查询,时间复杂度要比在内存上复杂好几倍,所以一定要注意,在使用索引查询时.利用索引查询时可能会影响增删改的效率,可能会快也可能会慢,当然索引的利还是大于弊的.

索引的三大操作及注意事项

create index 索引名 on 表名(列);创建索引时一定要提前规划好自己的需求,对一个表中的那几列需要进行索引,可以更方便的查找,如果一个表已经创建好了,需要对有的列进行添加索引的操作,是非常危险的操作,一定要小心慎重,针对空表,数据量小的数据库进行创建索引操作,不会有太大危险,如果是数据量特别大的表,会产生大量的IO操作,直接把数据库给搞挂了.万一有一个表,没有提前创建索引,现在又有很多的数据,非加索引不可,那么我们可以重新创建一个数据库,然后将这个数据库的数据导入到新数据库中,然后切换程序访问新数据库        

drop index 索引名 on 表名.删除在数据库中不用多说,是一项特别危险的操作.所以注意事项就是要确保一般不要删除.

show index from 表名

索引背后的数据结构(B+树)

索引是特定的数据结构在硬盘中存储,索引是为了方便查询,提高查询效率,那么我们思考一下在学过的数据结构中那些数据结构可以快速查询的,那么我们可以使用B+树来作为索引的数据结构,B+树专门为数据库量身定制的数据结构,那么介绍B+树前,我们需要先了解B树,B树还可以进行优化,此时我们引出了B+树的概念,B+树也是N叉搜索树,B+树与B树的区别:B+树有N个key,划分出N个区间,例如8,15一个区间为小8的,另一个区间为8-15之间,15是这个范围的最大值,而小于8的这个区间会直接把8落下来作为该区间的最大值,8-15这个区间同理,15为最大值.并且父节点的key的值,会在下面子节点再次出现(以子结点的最大值出现),按照上述方法排序,叶子节点就构成了整个树数据的全集,B+树把叶子结点像链表一样首尾相连(类似于双向链表),此时进行"范围查询"就会特别方便

优势B+树 

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

2.叶子结点是全集,并且用链表结构链接,非常适合范围查询.

3.B+树,所有的查询都要落到叶子结点,任何一次查询经历的IO次数和比较次数差不多,稳定.如果是B树,可能会一下找到也可能寻找多次.不稳定.

4.由于B+树,叶子结点是全集,非叶子结点不需要存储数据行,只需要存储索引列的key,使得非叶子结点消耗空间少

数据库中的表只是一个逻辑上的结构.在物理上并非一个真正意义的表,在物理意义上就是通过B+树来组织的,表中的每一行都是挂在B+树的叶子结点的,非叶子结点只需存储一个key的值,可以把这些非叶子结点的key的值存放在内存中,可以加快查询速度,减少硬盘IO次数

B树

B树是一个N叉搜索树,他的一个结点保存了N个key,就能延伸出N+1个子树,但是我们使用索引是为了方便查找,在指定范围内进行查找,每个结点可以有多个子树(树的度为N),这样就可以降低树的高度,每个结点不是只存一个key了,可以存多个key,会使树的高度降低了,每个结点的比较次数变多了,和每个结点进行比较时,先进行一次硬盘IO, 把数据读取出来,然后在内存上进行比较.目的是为了减少硬盘IO的次数(核心问题)

为什么其他的数据结构不能作为数据库索引的数据结构呢?

其中二叉搜索树和哈希表,是可以查询的.二次搜索树的时间复杂度为O(N),哈希表的时间复杂度近似O(1),但是二叉搜索树和哈希表都不适合给数据库做索引,因为二叉搜索树最大的问题就在于:储存的元素特别多,树的高度就会变得很高,那么比较的次数就会变多,如果我们是在内存中多比较两次无伤大雅,但是如果在硬盘上多进行两次比较那么是特别伤的,会进行多次IO操作,体现不出高效,而哈希表只能查询相等的情况,不能进行< > 的比较,也不可以like模糊查询,因为哈希表是通过哈希函数,将查询的key映射成数组下标的,没有等价关系key1 < key2 =>不能推出 hash(key1) < hash(key2)


http://www.ppmy.cn/news/1464042.html

相关文章

【Nginx <三>⭐️⭐️⭐️】Nginx 负载均衡使用

目录 &#x1f44b;前言 &#x1f440;一、 负载均衡概述 &#x1f331;二、项目模拟 2.1 环境准备 2.2 启动多个服务器 2.3 配置 Nginx 2.4 测试配置 &#x1f49e;️三、章末 &#x1f44b;前言 小伙伴们大家好&#xff0c;前不久开始学习了 Nginx 的使用&#xff0c;在…

docker image prune -f 命令什么用途

docker image prune -f 命令用于清理系统中未被使用的 Docker 镜像。具体来说&#xff0c;它会删除那些未被任何容器使用的悬空镜像&#xff08;dangling images&#xff09;&#xff0c;从而释放磁盘空间。 以下是 docker image prune -f 命令的具体用途和作用&#xff1a; …

mac安装的VMware虚拟机进行桥接模式配置

1、先进行网络适配器选择&#xff0c;选择桥接模式 2、点击网络适配器 设置... 3、选择WiFi&#xff08;我使用的是WiFi&#xff0c;所以选择这个&#xff09;&#xff0c;注意看右边的信息&#xff1a;IP和子网掩码&#xff0c;后续配置虚拟机的ifcfg-ens文件会用到 4、编辑if…

贪心算法[1]

首先用最最最经典的部分背包问题来引入贪心的思想。 由题意可知我们需要挑选出价值最大的物品放入背包&#xff0c;价值即单位价值。 我们需要计算出每一堆金币中单位价值。金币的属性涉及两个特征&#xff0c;重量和价值。 所以我们使用结构体。 上代码。 #include <i…

1.每日设计模式-理论

目录 一、什么是设计模式 二、设计原则 三、设计模式的种类 代码地址&#xff1a;patterns: 每日设计模式 一、什么是设计模式 软件设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结&#xff0c;使用设计模式是为了可重用代码…

VSCode开发Python-Django入门

一、安装配置Python环境及配置Python环境变量 1、python安装包安装后&#xff0c;需要注意pip.exe和pip3.exe的安装&#xff1b; 2、环境变量需要配置两个目录&#xff1b; 3、验证python是否安装成功 通过cmd命令执行&#xff1a;python --version 查看python版本&#xff…

【全开源】赛事报名系统源码(Fastadmin+ThinkPHP和Uniapp)

基于FastadminThinkPHP和Uniapp开发的赛事报名系统&#xff0c;包含个人报名和团队报名、成绩查询、成绩证书等。 构建高效便捷的赛事参与平台 一、引言&#xff1a;赛事报名系统的重要性 在举办各类赛事时&#xff0c;一个高效便捷的报名系统对于组织者和参与者来说都至关重…

初学C语言100题:经典例题节选(源码分享)

1.任意从键盘输入三条边的长a,b,c,判断三边是否能构成三角形&#xff0c;若构成三角形则进一步判断该三角形是 等腰三角形&#xff0c;等边三角形&#xff0c;一般三角形 #include <stdio.h> int main() {int a, b, c;//定义三条边变量printf("请输入三条边\n"…