MySQL数据库的索引

news2024/12/23 19:28:42

在这里插入图片描述

文章目录

  • 一、索引是什么?
    • 索引的作用
  • 二、索引的使用
    • 查看索引
    • 创建索引
    • 删除索引
  • 三、索引的底层

一、索引是什么?

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

索引的作用

1.数据库中的表,数据,索引之间的关系,类似于书架上的图书,图书内容,图书目录的关系。
2.顾名思义,索引类似于图书目录,可以快速的定位我们想要看的位置。
3.索引可以大大提高数据库的性能。

索引我们可以例比着书的目录去理解,当我们有了目录的时候,我们就可以很快的找到对应内容的位置。
索引的效果:
加快了查找的速度,进行数据库操作时,常用的操作是增删查改,但是查询是日常业务中最最频繁的操作

同时,索引提高查询速度的同时,也增加了增删改的开销,因为当我们修改操作时,索引也会跟着改变。空间的开销也会增大,需要额外的空间来保存索引。

二、索引的使用

查看索引

show index from 表名;
-- 创建一个学生表
create table student(id int primary key,name varchar(50));

在这里插入图片描述
我们可以发现在学生表中,我们未手动添加索引,但是它会自带一个索引。
创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。其实也很好理解,上面这几种情况,在进行相关操作时,都会先对表中相应的列去查询,如果不去添加索引,就会去一条一条去遍历表中的数据,那么效率将大大的低下.

创建索引

create index 索引名 on 表名(字段名);
-- 给学生表名字创建一个索引
 create index idx_stu_name on student(name);

在这里插入图片描述
我们可以发现成功给name加入了一个索引。
注意事项;
索引虽然是一个很便捷的东西,但是我们使用它的时候一定得小心,我们如果需要加索引的话尽量在创表的时候就搞好,否则将是一个十分危险的操作,如果我们这个时候去创建一个索引的话,就会占据大量的资源(磁盘IO等),就跟我们在写一本书,在写好书之后再去编写目录,索引是同理,是一件很麻烦的事情,会花费大量时间,时间取决于数据量的大小

加上索引后查询一定快吗?
不一定,当数据量特别少,一行行查询可能会更快。
如果你是给大量重复的数据加索引(如性别),也是无法提高查询速度的。

删除索引

drop index 索引名 on 表名;
-- 删除学生表name索引
drop index idx_stu_name on student;

在这里插入图片描述
同样的删除索引也是会耗费大量的资源,是一项危险的操作

三、索引的底层

那么索引在MySQL中的数据结构是什么呢?
1.哈希表
在这里插入图片描述
哈希表是一项查询为常数项的数据结构,但是哈希表不适合去当做数据库的索引。因为哈希表虽然查找速度很快,但无法进行between and这样的范围查询。
2.二叉搜索树
在这里插入图片描述
这里我们在查询元素的时候,时间复杂度是多少?
long(N),当这个二叉搜索树是单分支最差情况下,二叉树因为前序遍历是有序的,因次可以满足between and 的范围查询,但是当元素个数增多时,树的高度高时,元素的比较的次数也会增多,硬盘的操作也会增多,因此也不太适合。
3.N叉搜索树
在这里插入图片描述
我们可以发现N叉搜索树(B树),在二叉搜索树的基础上,每个节点有多个值,同时有多个分叉,树的高度降低了,比较次数虽然没有减少,但是在硬盘上读的次数减少了许多(因为每次读的操作都是在硬盘上).我们发现B树已经能够做数据库的索引,但是在实际开发中对性能要求远不止此,B+树就是为了索引量身定做。
4.B+树
在这里插入图片描述
1.B+树是N叉搜索树的一个升级版,每个节点的最后一个值就是局部最大值了。
2.叶子节点会用一个双链表首尾相连,当我们需要进行between and的操作时,只需要root tail 指针指向相应节点,然后遍历即可。
3.父元素会在子节点重复出现,并且是最大值。

B+树的优势:
1.除了叶子节点都是简单的存储了id,最终都会落到叶子结点,所以无论查询那个元素,比较次数大差不差,查询操作不会出现大差异。
2.因为叶子结点存储了所有的key,所以我们只需把真正的数据只存储在叶子结点即可。
3.更适合范围查询,双链表连接。
4.N叉搜索树高度降低了,硬盘上的IO操作大幅度减少。

如果是多索引怎么办?
比如主键索引是id,非主键索引的姓名。
那么姓名索引的B+树的叶子节点存储的都是主键id,找到id后,再去主键索引idB+树去遍历,主键idB+树的叶子节点存储的是完整数据行,此操作成为回表

我们在此处所谈的B+树只是在MySQL的InnDB这个数据库引擎所使用的典型数据结够。不同的数据库有不同的引擎,索引的数据结构也会有所差异。

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

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

相关文章

[附源码]java毕业设计医疗预约系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

SQL注入原理、过程、防御方案、RASP概念

一、sql注入原理 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的语句上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息…

第1关:Hive的安装与配置

为了完成本关任务,你需要掌握: 1.Hive的基本安装; 2.Mysql的安装与设置; 3.Hive 的配置。 注意:本关实训Hive的安装与配置建立在Hadoop已安装配置好的情况下。 Hive 的基本安装 从 官网 下载Hive二进制包&#xf…

优维科技CTO黎明访谈实录:“大场景+小算法”构建AiOps运维技术哲学

智能运维、自动化运维发展到现在,已经有将近7成的IT管理者学会利用大数据、人工智能产品及解决方案赋能团队,在生产效率、适应性和决策能力等层面实现了切实有效的正向转型。 今天的中国企业,已经在云端新基建、数字化转型的浪潮中实现降本增…

美食杰项目 -- 菜品信息(五)

目录前言:具体实现思路:步骤:1. 展示美食杰菜谱大全效果2. 引入element-ui3. 代码总结:前言: 本文给大家讲解,美食杰项目中 实现菜品信息页的效果,和具体代码。 具体实现思路: 跳转…

[附源码]java毕业设计疫情防控期间人员档案追寻系统设计与实现论文

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

bash shell 初体验-尚文网络xUP楠哥

~~全文共1139字,阅读需约5分钟。 进Q群11372462,领取专属报名福利,包含云计算学习路线图代表性实战训练大厂云计算面试题资料! # bash shell 简介 我们在操作Linux系统时,绝大部分情况是通过命令行的方式输入指令,Li…

小型企业建立人力资源团队的 5 个步骤

作为小企业主,设置人力资源运营可能不是您的首要任务。但是,随着您扩大运营规模和员工人数,您可能会遇到合规性和员工敬业度问题,从而阻碍您的业务增长。组建一个团队来照顾您的人力资源运营和员工可以让您专注于改进您的产品和满…

【JVM】字节码技术:手撕 多态执行原理

一、源文件 package org.example.classLoading;import java.io.IOException; /*** 演示多态原理,注意加上下面的 JVM 参数,禁用指针压缩* -XX:-UseCompressedOops -XX:-UseCompressedClassPointers*/ public class PolymorphicTest {public static void…

【序列召回推荐】(task2)序列召回GRU4Rec和faiss使用

学习总结: 一般的RNN模型我们的输入和输出是什么,我们对RNN输入一个序列 X[x1,x2,...,xn]X [x^1,x^2,...,x^n]X[x1,x2,...,xn] ,注意我们序列中的每一个节点都是一个向量,那么我们的RNN会给我们的输出也是一个序列 Y[y1,y2,...,…

[附源码]SSM计算机毕业设计江苏策腾智能科技公司人事管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

.net----特性

特性特性的概念和使用特性(Attribute)特性形式特性类参数预定义通用特性类ConditionalAttribute类ObsoleteAttribute类AttributeUsageAttribute类全局特性自定义特性类使用反射访问特性特性的概念和使用 特性(Attribute) 特性类&…

http请求报头header

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.认识请求报头(header) 1.Host 2.content-length 3.content-type 常见的三种格式 小结 二.User-Agent(简称UA) 三.Referer 四.C…

进程创建进程终止进程等待

目录前言一、进程创建1.fork()函数(1)fork()函数的基本认识进程调用fork()函数之后,控制权转移到内核中的fork()代码之后,内核做了啥?(2)实验:使用fork()函数创建进程(3&…

跨境电商卖家必知的【圣诞节营销】终极指南(一)

关键词:圣诞节营销、跨境电商卖家 不知不觉又到了年底,而对于跨境电商来说也是非常重要的一段促销时期,也许您已经制定了相关的圣诞节营销大促,但今天我们还是想告诉您一些2022年非常棒的销的创意想法,希望能帮助您提升…

Spring Cloud Alibaba(四)

openFeign配置日志 一、openFeign的日志级别: NONE:不记录日志 (默认). BASIC:只记录请求方法、url、响应状态码和执行时间。 HEADERS:在basic的基础上,增加请求和响应头 FULL:记录请求和响应的头、body…

PyTorch搭建RNN联合嵌入模型(LSTM GRU)实现视觉问答(VQA)实战(超详细 附数据集和源码)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、视觉问题简介 视觉问答(VQA)是一种同时设计计算机视觉和自然语言处理的学习任务。简单来说,VQA就是对给定的图片进行问答,一个VQA系统以一张图片和一个关于这张图片形式自…

用HTML+CSS+JS写的切水果小游戏它来了

前言 切水果游戏曾经是一款风靡手机的休闲游戏,今天要分享的就是一款网页版的切水果游戏, 由HTMLCSSJS实现,虽然功能和原版的相差太大,但基本的功能具备,效果逼真。感兴趣的小伙伴可收藏学习(完整源码在文…

Heterogeneous Parallel Programming 异构并行编程 - UIUC伊利诺伊大学(持续更新)

Lecture 11.2 Introduction to Heterogeneous异构1.3 Portability and Scalability1.4 Introduction to CUDA 数据并行化 and 执行模型1.5 Introduction to CUDA 内存模型 and 基本函数API1.6 Introduction to CUDA Kernel-based SPMD1.7 更高维的Grid的Kernel-based SPMD例子1…

Linux的基本协议与他的堂兄堂弟

14天学习训练营导师课程: 互联网老辛《 符合学习规律的超详细linux实战快速入门》 努力是为了不平庸~ 学习有些时候是枯燥的,但收获的快乐是加倍的,欢迎记录下你的那些努力时刻(学习知识点/题解/项目实操/遇到的bug/等等&#xf…