【面试题】谈谈MySQL的索引

索引是啥

可以把Mysql的索引看做是一本书的目录,当你需要快速查找某个章节在哪的时候,就可以利用目录,快速的得到某个章节的具体的页码。Mysql的索引就是为了提高查询的速度,但是降低了增删改的操作效率,也提高了空间的开销。比如一本书很薄的时候,章节不多,对应的目录也就很少 ,可能才一两页,当书的章节很多时,对应的目录也就很多,需要更多的页码来存储目录,当数据库中表的数据很多时,对应的索引也就需要更多的空间来保存,因此说空间的开销会被增加。

  • 查看索引

    show index from 表名

    image-20240220145011069

key_name 是索引名,column_name是根据id这列创建了索引。当表里有primary key、unique和foreign key 时数据库会自动创建索引,每次进行操作表时,数据库会自动判断是否走索引,效率高不高。

  • 创建索引

create index 索引名 on 表名(列名)

image-20240220145321269image-20240220145508380

针对student里的name列创建一个名为inx_name的索引,当再次查看student里的索引时,可以发现多了一个名为inx_name的索引名。

  • 删除索引

drop index 索引名 on 表名

image-20240220145713271

索引的数据结构

MySQL创建索引的目的是为了加快查找速度,因此可以考虑查找速度较快的数据结构,比如哈希表,哈希表的查找时间复杂度是O(1),不过不能范围查询,但是MySQL经常查询时带有范围条件,因此哈希表是不适合做索引的数据结构。二叉搜索树适合范围查询,查询的速度也比较快,时间复杂度是O(N),但是二叉搜索树的高度决定了元素的比较次数,当树的高度较高时,比较次数也会增加,而比较操作又需要进行IO操作的,因此当比较次数增加时,IO操作的次数也增加了,IO操作是很费系统资源的,所以二叉搜索树也不适合索引的数据结构。针对二叉搜索树的高度问题,可以引入一个N叉搜索树,把高度降低。N叉搜索树的典型实现是B树,N叉搜索树每个节点有N个key,同时有多个分叉,因此这样就把高度降低了,不过比较次数并没有减少,一个节点上的元素可能涉及到多次比较,但是读写硬盘(IO)的次数减少了,因为每个节点都在硬盘上,读一次硬盘可以读到N个key,之前的二叉搜索树读一次硬盘只能获得一个key。但是B树还是不能做索引的数据结构。现在就针对比较次数进行优化,引入了一个B+树,B+树也是一个N叉搜索树,B+树每个节点上包含N个key,N个key可以划分N个区间,每个区间内的最后一个key是最大值,可以看下图发现叶子没有了80、90这种节点,父元素的key会以最大值的方式在子元素中重复出现,因此叶子节点就包含了整个数据的全集,最后再把叶子每个节点用类似于链表的方式连接起来。

image-20240220152405222

image-20240220152552599

B+树是很适合做MySQL的索引,它具有以下几个特点:

  1. 由于高度降低了,因此比较次数降低了,IO读写次数也减少了,叶子节点之间连接,更适合做范围查询,比如查询 3<id and id <10的元素,可以直接从叶子节点中取。

  2. 由于所有数据元素都落在了叶子节点,因此查询哪个元素,比较次数都是差不多的,查询操作相对均衡。而对于B树的查询可能有的快,有的慢,比如查询根节点的元素时就很快,查询叶子节点时就很慢。

  3. 由于所有的key都会在叶子节点体现,因此非叶子节点可以只存一个索引值,比如id,叶子结点存数据库里真实的数据(数据行),这样就导致非叶子节点占用的空间大大降低,有可能在读取硬盘时可以把非叶子节点的索引值全部读到内存中,更进一步的降低了IO次数。

    image-20240220155533507

对于带有主键列的索引是按照这种B+树组织的,而对于不带主键列的数据创建了索引,是按另一种B+树实现的。比如非叶子节点存学生姓名name,叶子节点存放主键id,当使用主键列查询数据时,只需要去主键列创建的索引查询一遍即可,当使用非主键列创建的索引,需要去非主键列索引里查询到对应的主键id,再使用这个id去主键列索引里查询对应的数据,需要两次查询,这种操作称为”回表“。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构-邻接链表

介绍 邻接矩阵是运用较多的一种储存图的方法&#xff0c;但如果一张网图边数较少&#xff0c;就会出现二维矩阵中大部分数据为0的情况&#xff0c;浪费储存空间 为了避免空间浪费&#xff0c;也可以采用数组与链表结合的方式来存储图 假设有这样一张图 我们可以先用一个数组…

unity学习(33)——角色选取界面(原版)

10ARPG网络游戏编程实践&#xff08;十&#xff09;&#xff1a;角色选择UI及创建面板制作&#xff08;一&#xff09;&#xff08;流畅&#xff09;_哔哩哔哩_bilibili 角色选择界面教程中是这样的&#xff01;&#xff08;这个美工肯定是不能拿出去卖的&#xff0c;但是是有…

Spring Boot与Feign:微服务架构下的优雅通信

1. 前言 本文将详细介绍在Spring Boot框架中如何使用Feign进行微服务之间的优雅通信。我们将从Feign的基本原理讲起&#xff0c;然后逐步展开使用Feign的完整流程和步骤&#xff0c;包括代码示例和详细注释。通过本文&#xff0c;读者将能够轻松掌握Feign在Spring Boot微服务架…

芯课堂 | 一种用于振荡器的修调电路

​ 高精度时钟产生器是数模混合集成电路及数字集成电路的主要模块。晶体振荡器供与工艺、电源电压和温度无关的稳定时钟&#xff0c;但它与集成电路工艺不兼容&#xff0c;同时有相对较高的成本&#xff0c;这样它的应用就受到了一些限制。随着CMOS集成电路工艺和SOC技术的…

[游戏开发][虚幻5]新建项目注意事项

鼠标右键点击Client.uproject文件&#xff0c;可以看到三个比较关键的选项&#xff0c; 启动游戏&#xff0c;生成sln解决方案&#xff0c;切换引擎版本 断点调试 C代码重要步骤 如果你想断点调试C代码&#xff0c;则必须使用使用代码编译启动引擎&#xff0c;你需要做几个操作…

D4580——具有两个独立的、高增益、低噪声,输出电流大,低失真的运算放大器,应用于音响系统,工业测量产品上

D4580内部包括有两个独立的、高增益、低噪声&#xff0c;输出电流大&#xff0c;低失真的运算放大器&#xff0c;适合于音频前置放大部分和有源滤波器&#xff0c;大电流输出的耳机放大器&#xff0c;也能用于工业测量单元。 主要特点&#xff1a; ● 工作电压范围宽 (2V ~18V…

spring Boot快速入门

快速入门为主主要届介绍java web接口API的编写 java编辑器首选IntelliJ IDEA 官方链接&#xff1a;https://www.jetbrains.com/idea/ IEDA 前言 实例项目主要是web端API接口的使用&#xff0c;项目使用mysql数据库&#xff0c;把从数据库中的数据的查询出来后通过接口json数…

【计算机考研】408系统学习法

计算机专业课基本上都是数据结构&#xff0c;计算机组成原理&#xff0c;计算机网络和操作系统中的内容 如果你考的学校是自命题&#xff0c;那么考察的专业课一般比较少&#xff0c;只有1-3门&#xff0c;比较顶尖的学校自命题考的比408还要难。如果考的是408&#xff0c;那么…

脚本项目一

第一题 1、判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。 第一步安装邮件服务 [rootserver ~]# yum install mailx -y [rootserver ~]# vim /etc/mail.rc set from2282475145qq.com se…

管理类联考--复试--简历

文章目录 整体细节个人信息报考信息教育背景校园经历/实践经历/工作经历校园经历实践经历工作经历 个人特长/奖项证书个人特长奖项证书 自我评价 整体 第一&#xff1a;肯定是个人信息&#xff0c;要让面试官第一时间了解你的基础信息&#xff1b; 第二&#xff1a;报考信息&a…

I/O复用 (包含select 和 poll详解)

目录 1&#xff1a;i/O复用技术的作用2: 什么情况下需要此技术select 系统调用select系统调用原型如下&#xff1a;fd_set结构体定义如下&#xff1a;可以使用如下宏访问fd_set 结构体中的位&#xff1a;timeout结构体如下&#xff1a;文件描述符就绪条件什么情况下 socket可读…

openai DALL-E 3 论文 提升图像生成的关键:更好的图像描述

摘要 我们展示了通过训练高度描述性的生成图像标题&#xff0c;可以显着改善文本到图像模型的提示跟随能力。 现有的文本到图像模型在跟随详细的图像描述方面存在困难&#xff0c;经常忽略单词或混淆提示的含义。 我们假设这个问题源于训练数据集中存在嘈杂和不准确的图像标…

shapely 笔记:基本方法

1 线性方法 1.1 object.interpolate(distance[, normalizedFalse]) print(LineString([(0, 0), (0, 1), (1, 1)]).interpolate(1.5)) #POINT (0.5 1)print(LineString([(0, 0), (0, 1), (1, 1)]).interpolate(0.75, normalizedTrue)) #POINT (0.5 1) LineString([(0, 0), (0…

URL、DNS过滤,AV---防火墙综合实验

拓扑图 该实验之前的配置请看我的上一篇博客&#xff0c;这里仅配置URL、DNS过滤&#xff0c;AV 需求 8&#xff0c;分公司内部的客户端可以通过域名访问到内部的服务器 这次的拓扑图在外网多增加了一个DNS服务器和HTTP服务器 DNS服务器IP&#xff1a;40.0.0.30 HTTP服务器…

SqlServer 用游标方式 获取总计累计到某个值/数字 的结果集

数据表准备&#xff1a; 情况1&#xff1a;GroupName1 获取累计 未超过 100 的记录 SQL 和 结果 图 如下&#xff1a; 情况2&#xff1a;GroupName2 获取累计 未超过 100 的记录 SQL 和 结果 图 如下&#xff1a; 附录&#xff1a; SQL 文本 ---------------- 自定义 Star…

MySQL数据库基础(七):DDL数据表操作

文章目录 DDL数据表操作 一、数据表的基本操作 1、数据表的创建 2、查询已创建数据表 3、修改数据表信息 ① 数据表字段添加 ② 修改字段名称或字段类型 ③ 删除某个字段 ④ 修改数据表名称 4、删除数据表 二、字段类型详解 1、整数类型 2、浮点类型 3、日期类型…

提升网络质量:UDPspeeder 实现网络优化与提速

提升网络质量&#xff1a;UDPspeeder 实现网络优化与提速 背景与意义原理与功能使用方法未来展望相关链接服务 在当今高度互联的网络环境下&#xff0c;网络质量的优化和提速对于用户体验至关重要。针对高延迟和丢包率较高的网络链路&#xff0c;UDPspeeder 提供了一种前向纠错…

说一下 JVM 运行时数据区 ?

目录 一、程序计数器&#xff08;Program Counter Register&#xff09; 二、Java 虚拟机栈&#xff08;Java Virtual Machine Stacks&#xff09; 三、本地方法栈&#xff08;Native Method Stack&#xff09; 四、Java 堆&#xff08;Java Heap&#xff09; 五、方法区&…

Docker Compose详解

Docker Compose详解 1.概述2.安装3.基本使用4.命令说明5.Compose 模板文件6.使用Docker快速安装wordpress 1.概述 Compose 项目是 Docker 官方的开源项目&#xff0c;负责实现对 Docker 容器集群的快速编排 使用一个 Dockerfile 模板文件&#xff0c;可以让用户很方便的定义一…

新版AI系统ChatGPT源码支持GPT-4/支持AI绘画去授权

源码获取方式 搜一搜&#xff1a;万能工具箱合集 点击资源库直接进去获取源码即可 如果没看到就是待更新&#xff0c;会陆续更新上 新版AI系统ChatGPT网站源码支持GPT-4/支持AI绘画/Prompt应用/MJ绘画源码/PCH5端/免授权&#xff0c;支持关联上下文&#xff0c;意间绘画模型…