【MySQL索引】提高查询速度和效率

news2024/10/6 16:30:02

1、认识索引

假设现在大家要去 MySQL 书中找索引的内容,大家应该不会拿着 MySQL 的书一张一张去找,而是会看MySQL 书的目录,然后通过目录找到索引对应的页码,再去对应的页码中查看索引的内容

索引的优点:

  • 索引就相当于书的目录,运用索引可以加快查找的速度

索引的缺点:

  • 索引虽然可以加快查找的速度,但是索引也提高了增、删、改的开销,因为进行增、删、改的时候需要调整已经创建好的索引

  • 索引还提高了空间的开销,构造索引也就需要额外的硬盘空间来保存

index 表示 索引,不管是查看索引,还是创建索引,......,只有是关于索引的操作一般都会有 index 这个单词

2、索引的操作

2.1 查看索引

一般创建主键约束、唯一约束、外键约束时,都会自动创建对应列的索引

接下来我们就创建一张学生表查看它的索引

student 表:

create table student(id int primary key,name varchar(20));

上述创建的student表中 id 是主键,所以 id 就会自动产生索引,当我们对 student 表进行查询索引的时候就可以查到 id 索引

查看索引:show index from 表名;

2.2 创建索引

当对数据表中的某列或是某几列创建索引,需要考虑以下几点:

  • 数据量较大,且经常对这些列进行条件查询

  • 该数据表的插入操作、修改操作、删除操作对这些列来说频率较低

  • 索引会占用额外的磁盘空间,考虑磁盘空间是否充足

对应非主键、非唯一约束、非外键的字段可以创建普通索引

创建一张 student 表:

//如果有student表,请先删除在创建
create table student(id int primary key,name varchar(20));

创建索引:create index 索引名 no 表名(字段名);

create index index_name on student(name);

注:创建索引,最好是在表创建之初就把索引创建好,否则如果是针对一个表中已经有很多很多记录的表,来创建索引也就是个危险操作,这个时候就会吃掉大量IO,花很长时间(可能是几十分钟也可能是几个小时,主要看数据量),那么在这段时间里,数据库就无法正常使用

2.3 删除索引

接下来我们就把 1.3 中添加的索引给删除

删除索引:drop index 索引名 on 表名;

drop index index_name on student;

注:删除索引也可能会吃大量的磁盘IO

3、索引在 MySQL 中的数据结构

1.索引在 MySQL 中的数据结构是 哈希表 ?

答:哈希表的查找元素的时间复杂度为 O(1),但是哈希表并不适合做数据库的索引,因为哈希表只能比较相等,无法进行范围查询

2.索引在 MySQL 中的数据结构是 二叉搜索树 ?

答:二叉搜索树查找元素的时间复杂度为 O(n),二叉意味着当元素个数多的时候,树的高度就会比较高。树的高度也就决定了查询时候元素的比较次数

3.索引在 MySQL 中的数据结构是 N叉搜索树 ?

答:N叉搜索树每个节点上有多个值,同时有多个分叉,树的高度就降低了。其中的一种典型实现,叫做B树。比较次数虽然没咋减少,一个节点上可能需要比较多次,但是读写硬盘的次数减少了,每个节点都是在硬盘上的。

B树:

B树是N叉树的一种典型实现,它的特定就是每个节点上有多个值,子节点里面的值都小于父节点的值

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

B+树的特定:

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

  • 父元素的 key 会在子元素中重复出现,并且是以最大值的姿态出现,这样重复出现,也就让叶子节点包含了所有数据的全集,非叶子节点中的所有值都会在叶子节点中体现出来

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

B+树:

B+树的优点:

  • 作为一棵N叉搜索树,高度降下来了,比较的时候硬盘IO次数就比较少了(同B树)

  • 更适合进行范围查询

  • 所有的查询,都是落在叶子节点上,无论查询哪个元素,中间比较的次数都差不多。对于B树来说,每次查询的速度可能不一样,但是对于B+树来说,每次查询的速度都一样

  • 由于所有的key都会在叶子节点中体现,只需要把所有的数据行放到叶子节点即可。非叶子节点只需要存简单的id,不用存一整行,这就意味着非叶子节点,占用的空间大大降低

有的表不仅有主键索引,还有别的非主键列也可能有索引,此时如何构造B+树?

答:构造一个主键列的B+树,然后再构造一个非主键列的 B+ 树。非主键列有索引的 B+树非叶子节点里面存的都是一些key(比如:一些学生姓名),到了叶子节点这一层,存的并不是完整的数据行,而是存的主键值。如果使用主键列进行查询,只需要查询一次主键列 B+树即可。如果采用非主键列来查询,则需要先查一遍非主键列的B+树,然后再查一遍主键列的B+树

当前B+树这个数据结构,只是针对 MySQL 的 innoDB 这个数据库引擎里面所典型使用的数据结构。不同的数据库,不同的引擎,里面存储数据的结构可能也不同

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

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

相关文章

文本三剑客

目录 文本三剑客 grep grep和egrep grep命令格式 grep命令格式 grep运用示例 正则表达式 基本正则表达式 拓展正则表达式 sed 使用sed sed用法示例 常用选项options示例 地址界定示例 编辑命令示例 sed高级编辑命令 awk awk的使用 printf命令 操作符 awk …

【嵌入式烧录/刷写文件】-2.7-将一个文本文件转换为Intel hex文件

案例背景(共5页精讲): 有如下两个文本文件(*.txt,*.ini,*.asc…)转换为Intel hex文件。常用于Key密钥,signature签名…的导入,或对一段数据计算出hex记录的最后一个字节的校验值,接…

Text-to-Table: A New Way of Information Extraction

原文链接: https://aclanthology.org/2022.acl-long.180.pdf ACL 2022 介绍 作者受到table-to-text任务(用于生成描述给定表格的文本语言)的启发,提出了text-to-table的新任务,根据给定的文本,来生成用于文…

分布式基础概念

分布式基础概念 1. 微服务2. 集群&分布式&节点3. 远程调用4. 负载均衡5. 服务注册/发现&注册中心6. 配置中心7. 服务熔断&服务降级8. API网关 1. 微服务 微服务架构风格,就是把一个单体架构按照业务拆分成多个服务模块,每个模块之间独立…

LAMP架构搭建实操(终有弱水替沧海,再无相思寄巫山”大概意思就是,你会遇到很多人,但不会有人像我那么爱你了。)

文章目录 一、安装Nginx服务1.安装依赖包2.创建Nginx运行用户3.编译安装Nginx源码包4.优化路径便于使用5、添加 Nginx 系统服务 二、安装Mysql服务1.安装Mysql环境依赖包2.创建Mysql运行用户3.编译安装4.修改mysql配置文件5.更改mysql安装目录和配置文件的属主属组6.设置路径环…

想知道如何把录音转变为文字?这三个录音转文字的方法和你分享

将录音转换为文字有许多实际应用场景,比如会议记录、学习和研究、采访记录、法律领域、医学领域、市场调研等等。总而言之,将录音转换为文字可以提供便利和效率,使得音频内容更易于阅读、搜索和编辑,并在需要时更方便地引用和分析…

Linux -- 进阶 Web服务器 搭建基于 HTTPS 协议的静态网站 (实验实操)

现在我们想架设一个 互联网网站的话,我们就得想法认证自己是官方的,得产生一个证书 这个证书呢,我们使用的是 X.509 格式的证书 该证书 包含三个文件 : key , csr , crt 。 先介绍下 : PKI(Public Ke…

C++中关于引用变量初始化的一些总结

目录 1 问题2 引用初始化的说明3 示例代码 1 问题 函数的引用参数要求比较严格&#xff0c;今天就因为一个问题卡住了。我将此问题简化为下面的演示代码&#xff0c; #include <stdio.h>class CBase { public:CBase() {};virtual ~CBase() {}; };class CDerive :public …

Baumer工业相机堡盟工业相机如何使用BGAPISDK联合Halcon将图像中的六一快乐字体提取出来(C#)

Baumer工业相机堡盟工业相机如何使用BGAPISDK联合Halcon将图像中的六一快乐字体提取出来&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机使用Halcon图像算法的技术背景Baumer工业相机通过BGAPI SDK联合Halcon使用图像算法1.引用合适的类文件2.BGAPISDK在图像回调中引…

ppt怎么转pdf?经验分享

随着现代技术的不断发展&#xff0c;PPT已经成为了一种常见的演示工具。然而&#xff0c;在某些情况下&#xff0c;我们需要将PPT转换成PDF文件。PDF文件具有易读性强、占用空间小、易于传输等优点&#xff0c;因此在一些场合下&#xff0c;PDF文件更为实用。那么&#xff0c;如…

【JavaSE】Java基础语法(四十二):NIO

文章目录 1. 概述2. NIO与BIO的区别3. NIO三大模块4. NIO创建缓冲区对象【应用】5. NIO缓冲区添加数据【应用】6. NIO缓冲区获取数据【应用】7. 小结 1. 概述 BIO Blocking IO,阻塞型IONIO No Blocking IO,非阻塞型IO阻塞IO的弊端 在等待的过程中,什么事也做不了非阻塞IO的好处…

【正点原子STM32连载】 第二十三章 电容触摸按键实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十…

Java网络开发(Tomcat)—— 登陆 和 注册功能 的实现 和 迭代升级

目录 引出登陆功能---从html到jsp1.登陆--用post请求2.用html文件的form表单登陆&#xff08;1&#xff09;index.html页面&#xff08;2&#xff09;login.html登陆的页面&#xff08;3&#xff09;LoginServlet.java处理输入信息的代码&#xff08;4&#xff09;登陆成功&…

分布式事务一 事物以及分布式事物介绍

一 事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中&#xff0c;一个事务由一组SQL语句组成。事务应该具有4个属性&#xff1a;原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 原子性&#xff08;at…

MyBatis - Spring Boot 集成 MyBatis

文章目录 1.版本要求2.导入依赖3.自动配置2.可配置项 MyBatis-Spring-Boot-Starter 可以帮助你更快地在 Spring Boot 之上构建 MyBatis 应用。通过使用该模块我们能够快速实现以下目的&#xff1a; 构建单体应用程序将几乎不需要样板配置使用更少的 XML 配置 1.版本要求 MyB…

Apache Kafka - 构建数据管道 Kafka Connect

文章目录 概述主要概念ConnectorTasksWorkesConvertersTransformsDead Letter Queue 主要使用场景主要价值Kafka Connect API vs Producer 和 Consumer API构建数据管道时需要考虑的主要问题ETL VS ELT数据整合方式的不同ETL 和 ELT 各有优缺点: 概述 Kafka Connect 是一个工具…

Linux二——Web基础与HTTP协议

Web基础与HTTP协议 一、Web基础1. 域名的概念2.域名空间结构3.域名注册4.网页的概念5. HTML概念6.网页基本标签1 二、HTTP协议1.HTTP概念2.HTML的基本标签3.头标签中常用标签4.内容标签中常用的标签 三、动态网页与静态网页1.静态网页2.动态网页3.动态网页和静态网页的区别4.动…

软件测试目的是什么?软件测试公司可提供哪些测试服务类型?

随着科技的不断发展&#xff0c;软件行业的发展也越来越迅速。然而&#xff0c;随着软件的增多和复杂性的提高&#xff0c;开发者们需要更多的手段来确保软件质量。软件测试就是通过一系列的测试来发现软件的问题&#xff0c;从而提高软件的质量。 一、软件测试目的是什么? …

Unity中的UniTask如何取消指定的任务或所有的任务

今天儿童节&#xff0c;犬子已经9个多月了&#xff0c;今天是他的第一个儿童节。中年得子&#xff0c;其乐无穷无尽啊… 〇、 示例效果 一连创建5个异步任务[id 从0~4]&#xff0c;先停止其中的第id 4的任务&#xff0c;再停止所有的任务 一、CancellationTokenSource有什…

利用矩阵分解实现图像压缩(实验)

机器学习的课程&#xff0c;老师布置了一个实验报告&#xff0c;当我看到实验内容&#xff0c;傻眼了&#xff0c;手写计算矩阵特征值和特征向量的函数&#xff0c;这给我整无语了&#xff0c;直接调用已有的不好吗&#xff0c; 我直接摆烂。 实验报告放这了&#…