当前位置: 首页 > news >正文

【面试题】MySQL索引相关知识点

1.什么是索引

索引是存储引擎快速查找记录的一种数据结构,就类似书的目录,通过目录可以快速的查找到想要查找的内容


2.索引的特点

  • 特点:索引是基于数据引擎的,不同的数据引擎实现索引的方式不一定相同

  • 好处:通过索引,可以降低磁盘IO的次数,从而加快查找的效率

  • 坏处:

    • 创建索引和维护索引要耗费时间 ,并且随着数据量的增加,所耗费的时间也会增加。
    • 大量的索引,索引文件就可能比数据文件更快达到最大文件尺寸。(innoDB .ida MyISAM myd数据 myi索引)
    • 虽然索引大大提高了查询速度同时却会降低更新表的速度 。当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。因此,选择使用索引时,需要综合考虑索引的优点和缺点。

3.采用B+树作为索引以后查询一条记录的过程

  • 首先在根节点的数据页中,根据每一页里面的页目录(占用连续存储空间),进行二分查找,找到其对应的二级目录页。
  • 在二级目录页中采用相同的方法进行查找。直到查找到叶子节点。
  • 在叶子节点中,使用二分查找法查找到对应的记录。

4.B+树索引的特点

  • 所有节点都存放数据。叶子节点存放用户的记录,非叶子节点用来存放目录项。
  • 叶子节点之间通过双链表连接,叶子内部采用单链表连接

5.聚簇索引

  • 聚簇索引指的是用户存储的数据都存储在叶子节点上的索引。即索引即数据,数据即索引。
  • 常见的有InnoDB中的主键索引就是聚簇索引。

存储内容

  • 非叶子节点存储页号以及对应页中主键的最小值。
  • 叶子节点存放记录的全部信息

优点:

  • 对于使用主键索引进行查找数据的时候相应速度很快,因为数据都已经存储在叶子节点上了
  • 对于排序和范围查找都很快。因为本身就是有序的,而且由于数据都在叶子节点,那么直接遍历叶子节点组成的双链表即可。同时减少了大量的IO操作。

缺点:

  • 插入速度依赖于插入顺序。如果不按照主键递增顺序插入,那么就会产生页分裂,严重降低插入速度。
  • 更新主键的代价很高。可能会产生大量元素的移动。
  • 二级索引在访问的时候需要回表操作。

限制

  • 由于物理存储方式的限制,同一个表只能有一个聚簇索引。

6.二级索引 非聚簇索引

  • 聚簇索引仅仅通过主键检索的时候才会生效,如果想按照别的字段进行检索的话,那么就需要建立非聚簇索引了。

存储内容

  • 非叶子节点存储的是索引列的信息以及页号和对应页的最小主键值(为了防止索引列相同时无法判断)
  • 叶子节点存储的是索引值,以及对应的主键值,用于回表操作。

对比

  1. 聚簇索引的叶子节点存储的就是我们的数据记录,非聚簇索引的叶子节点存储的是数据位置。非聚簇索引不会影响数据表的物理存储顺序。
  2. 一个表只能有一个聚簇索引,因为只能有一种排序存储的方式,但可以有多个非聚簇索引,也就是多个索引目录提供数据检索。
  3. 使用聚簇索引的时候,数据的查询效率高,但如果对数据进行插入,删除,更新等操作,效率会比非聚簇索引低。

3.联合索引

  • 联合索引本质上也是二级索引:先把各个记录和页按照c2列进行排序。

  • 在记录的c2列相同的情况下,采用c3列进行排序

  • 先按照C2排序,C2相同按照C3排序


7.InnoDB二叉树索引的两个特点

根节点万年不变

  • 为根节点创建一个数据页,存放根节点,成为根页面。
  • 当向表中插入数据时,直接将数据存放在根节点。
  • 当根节点存储满了以后,再次插入数据会首先创建一个新的页面,将根节点的内容复制到这个新页面中,然后再创建一个新页面用来存放新插入的值。最后根节点变成目录节点。
  • 当根节点中的目录项存满以后,再次插入新的目录项会像上一步一样,创建新数据页,将目录项复制到新数据页中,根节点变成了目录项的目录项。
  • 从始至终,根节点的位置都不会发生变化,发生变化的只是里面存储的内容会变。

内节点目录项记录的唯一性

  • 在非聚簇索引中,某些字段可能会重复,导致非聚簇索引中出现了除了页号以外的其他字段都相同的节点,这样在查找的时候就会出现不知道应该走哪一个节点的问题。因此实际上,在非聚簇索引的每一个节点中,还会添加主键字段。

8.MyISAM索引的原理

  • MyISAM引擎的索引和数据是分离的,在存储数据时直接将文件写入到磁盘中。
  • MyISAM会按照主键值创建索引,索引的叶子节点存储的是当前记录所在磁盘的地址。
  • MyISAM实现了索引与数据的分离,因此在磁盘中会创建myi和myd两个文件
  • MyISAM中只有非聚簇索引。

9.InnoDB和MyISAM的区别

  • InnoDB中包含聚簇索引和非聚簇索引两种,在按照主键进行查询的时候,查找一次就可以查找到结果;MyISAM中所有的索引都是非聚簇索引,查询所有的数据都需要进行回表操作。

  • InnoDB中索引和数据是在一起的,底层存储文件为ibd;MyISAM中数据和索引是分离的,分别存储为myi和myd两个文件

  • InnoDB的索引叶子节点中存储的是数据;MyISAM中存储的是数据存储的地址

  • MyISAM的回表速度很快,因为是直接通过地址访问;而InnoDB需要根据主键再次去聚簇索引中取数据,因此速度慢一些

  • InnoDB必须有主键

InnoDB

  • 支持事务,支持索引,支持行锁,在并发状态下仅所行,大幅提高并发性。提供外键约束

  • 不保存表的行数,每次查询需要遍历整个表

  • 主要为海量数据的最大性能设计

  • 崩溃后可以安全的恢复

MyIASM

  • 不支持事务管理,不支持外键,不支持行锁。在增删改的时候,会直接锁住整个表,导致效率低下。
  • 保存了表的行数,在查询表的行数时不需要遍历整个表,效率高
  • 数据量比较小的情况下效率较高
  • 由于不支持事务,所以在崩溃后无法安全的恢复数据

10.索引的代价

  • 空间上:会占用大量的存储空间
  • 时间上:在增删改的时候,由于使用了索引,会导致增删改的时候效率不高。

11.可以成为索引的数据结构有什么,分别有什么特点

主要有两大类:分别是基于哈希表的结构和基于树的结构。
基于哈希表的比如说Redis数据库;MySQL中大部分的存储引擎都是基于树的


12.为什么不采用哈希表结构

  • 哈希表仅能完成等值查找,如果要进行范围查找,那么查找的时间复杂度就会变成O(n),而树由于其有序性,仍然保持O(logn)。
  • 哈希表存储是没有顺序的,因此如果进行Order By的时候,还需要对结构进行重新排序。
    对于联合索引,哈希表将联合后的索引一起求哈希值,无法单独对一个或几个索引建进行查询。哈希表无法做到最左匹配原则
  • 哈希表无法实现模糊查询
  • 对于等值查询来说,哈希值的效率非常高,但是如果要查找的列存在大量重复的话,那么效率会降低到O(n)
  • InnoDB本身也是支持哈希表的,它提供了自适应哈希表,当某个数据经常被访问,那么他会将数据存储到哈希表中,下次查询时直接从哈希表读取数据。

13.B树和B+树的区别

  • B树的数据即存储的叶子节点也存储在非叶子节点;B+树的数据都存储的叶子节点,其非叶子节点存储的都是目录项。导致B+树在查找中效率更加稳定,英文查询数据所需磁盘IO次数相同。B树由于非叶子节点也存储数据,因此查找某一条记录所需要的IO次数不固定
  • 存储相同的数据通常B+树的层数更少,因此非叶子节点仅仅存储目录项,所以整个树的高低更低,IO次数少,所以效率比B树高
  • 在范围查找和排序时,B+树效率更高。因此其叶子节点构成了一个有序链表,查找起来速度很快。B树需要中序遍历才可以。

14.B+树的存储能力如何?为何说一般查找行记录,最多只需1~3次磁盘IO

InnoDB存储引擎中页的大小为16KB, 一般表的主键类型为INT (占用4个字节)或BIGINT (占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree 中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为103。也就是说一个深度为3的B+Tree索引可以维护103 * 10^3 * 10^3 = 10亿条记录。(这里假定一个数据页也存储10^3条行记录数据 了)实际情况中每个节点可能不能填充满,因此在数据库中,B+Tree 的高度一般都在2~4层。MySQL 的InnoDB存储引擎在设计时是将根节点常驻内存的,也就是说查找某一键值的行记录时最多只需要 1~3次磁盘1/0操作。


15.什么字段应该建立索引

  • 有唯一性要求的字段
  • where后面的字段
  • gruop by 或者order by后面的字段

相关文章:

【面试题】MySQL索引相关知识点

1.什么是索引 索引是存储引擎快速查找记录的一种数据结构,就类似书的目录,通过目录可以快速的查找到想要查找的内容 2.索引的特点 特点:索引是基于数据引擎的,不同的数据引擎实现索引的方式不一定相同 好处:通过索引…...

MySQL索引类型及原理?一文读懂

一、什么是MySQL索引? MySQL索引是一种数据结构,用于提高数据库查询的性能。它类似于一本书的目录,通过在表中存储指向数据行的引用,使得查询数据的速度更快。 在MySQL中,索引通常是在表上定义的,它们可以…...

【C语言】字符分类函数+内存函数

目录 1.字符函数 1.1字符分类函数 1.2.字符转换函数 //统一字符串中的大小写 2.内存处理函数 2.1内存拷贝函数memcpy //模拟实现memcpy 2.2内存移动函数memmove //模拟实现memmove 2.3内存比较函数memcmp 2.4内存设置函数memset 1.字符函数 1.1字符分类函数 头文…...

高通平台开发系列讲解(SIM卡篇)SIM卡基础概念

文章目录 一、SIM卡基本定义二、卡的类型三、SIM卡的作用三、SIM卡基本硬件结构四、SIM卡的内部物理单元五、卡文件系统沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍SIM的相关组件。 一、SIM卡基本定义 SIM卡是一种智能卡(ICC Card/UICC Card) SIM…...

记录一次ubuntu下配置ssh登录出现的问题

现象描述: 1. 配置完服务器端公钥和本地的私钥之后,ssh登录始终会让输入密码,用ssh -vvv rootip 查看发现发送密钥之后就没反应了。 本机debug info: debug1: Trying private key: C:\Users\wangc/.ssh/id_xxxx (私钥文件) debug3…...

深度剖析数据在内存中的存储(下)(适合初学者)

上篇讲解了整形在内存中的存储方式,这篇文章就来继续讲解浮点数在内存中的存储方式。 上篇地址: (5条消息) 深度剖析数据在内存中的存储(上)_陈大大陈的博客-CSDN博客 目录: 3.浮点型在内存中的存储 3.1.浮点数的…...

智慧物联网系统源码:一个用于数据的收集、处理、可视化、设备管理、设备预警、报警的平台

项目简介: 一个用于数据的收集、处理、可视化、设备管理、设备预警、报警的平台,通过平台将所有设备连接起来,为上层应用提供设备的管理、数据收集、远程控制等核心物联网功能。 支持支持远程对设备进行实时监控、故障排查、远程控制&#…...

2023年,拥有软考证书在这些地区可以领取福利补贴

众所周知,软考的含金量很高,比如可以入户、领取技能补贴、抵扣个税、以考代评、招投标加分,入专家库… 今天小编给大家收集了拥有软考证书可以领取软考福利的地区,希望对大家有所帮助! 【深圳】 入户 ①核准类入户:…...

使用Unity在材质球上实现绘画:详细解释每一行Shader代码!

在Unity中实现在材质球上绘画可以使用下面这个步骤:创建一个基础的材质球:在Unity的项目面板中创建一个新材质球,然后将其分配给您要绘画的对象。创建一个Shader:为了实现在材质球上绘画,您需要使用一种特殊的Shader。…...

Tesseract 4.0训练字库并且识别训练后的图片

各个工具下载链接在文章底部! 重要!!自己先创建一个空文件夹(名字随意),用来保存训练后的模型 ,还需要在里面创建一个 名称为tessdata 的文件夹 ,必须叫这个名 可以先使用下载后的进行测试训练(只需要把ja…...

ChatGPT热潮背后,金融行业大模型应用路在何方?——金融行业大模型应用探索

ChatGPT近两个月以来不断引爆热点,对人工智能应用发展的热潮前所未有地高涨,ChatGPT所代表的大模型在语义理解、多轮交互、内容生成中所展现的突出能力令人惊喜。而人工智能技术在金融行业的落地应用仍然面临挑战,虽然已经让大量宝贵的人力从…...

【怎么预防sql注入,以及还有预防其他的什么网络攻击】

SQL注入是一种常见的Web攻击,通过在Web应用程序中注入恶意SQL语句来获取或修改数据库中的数据。为了防止SQL注入,开发者可以采取以下措施: 1、使用参数化查询(Prepared Statement)或存储过程(Stored Proce…...

2023年全国最新机动车签字授权人精选真题及答案4

百分百题库提供机动车签字授权人考试试题、机动车签字授权人考试预测题、机动车签字授权人考试真题、机动车签字授权人证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 11.使用转化炉原理测量氮氧化物的排气分析仪进行排气污…...

【Java】用记事本实现“HelloWorld”输出

【在进行以下操作前需要下载好JDK并配置好对应的环境变量】 一、在任意文件夹中创建一个新的文本文档文件并写入以下代码 public class Hello{public static void main (String[] args){System.out.print("Hello,World!");} } 二、修改文件名称及文件类型为 Hello.j…...

我希望早点知道的关于成长的建议

人上了年纪,往往在诸如更加闭塞,更加固执这些缺点之外,再多出来一个缺点:那就是动不动就爱给别人建议。我当然也未能免俗。有时候会听到同样悲观且固执的过来人告诉我,这些建议说了和没说效果都一样,人们在…...

【哈希表】使用方法总结

1. uthash简介开源的第三方头文件,这只是一个头文件:uthash.h。uthash还包括三个额外的头文件,主要提供链表,动态数组和字符串。utlist.h为C结构提供了链接列表宏。utarray.h使用宏实现动态数组。utstring.h实现基本的动态字符串。…...

【笑小枫-面试篇】Java基础面试题整理,努力做全网最全

写在前面 或许你只是想白嫖内容,或许你也会忽略这段文字,但我还是想弱弱的说 题目整理耗费了大量精力,希望可以给博主点赞收藏,谢谢大家啦 我呢,笑小枫,一个努力的普通人,也希望可以花1秒钟记住…...

亚马逊短期疲软,但长期前景乐观

来源:猛兽财经 作者:猛兽财经 由于投资者对亚马逊(AMZN)前景的担忧,导致该公司的股价在过去一年中下跌了39%。然而猛兽财经认为亚马逊近期面临的不利因素只是暂时的,该公司还是有充分的条件可以在医疗保健和物流领域获得重大增长机…...

webgis高德地图

webgis高德地图 首先准备工作,注册一个高德地图账号,然后在创建一个新应用生一个key跟appId 高德开放平台 接着创建一个html页面 高德配置手册 <style>* {margin: 0;padding: 0;}#...

django项目实战十(django+bootstrap实现增删改查)进阶数据统计

目录 一、echarts 1、下载 2、配置 二、实现统计分析页面--架构和柱图 1、url 2、chart.py 3、chart_list.html 4、修改url 5、新增chart_bar方法 6、修改chart_list.html 四、饼图 1、url 2、视图chart.py新增 3、修改chart_list.html 五、折线图 1、url 2、char…...

【布隆过滤器(Bloom Filter)基本概念与原理、Bloom Filter优点与缺点、以及应用场景】

布隆过滤器&#xff08;Bloom Filter&#xff09;基本概念与原理、Bloom Filter优点与缺点、以及应用场景 Bloom Filter 基本概念 布隆过滤器是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在…...

unity的Rendertexture上面显示粒子特效最便捷的解决方案

一、为什么不显示 1.为什么粒子特效也不显示? 不显示是正常的,因为当前为背景的点设置为A为0时已经被剔除,当前位置粒子特效的颜色也会被剔除。 因为clip发生在融合blend之前,blend发生在所有颜色输出之后的帧缓存。 2.为什么NGUI的Unlit/Premultiplied Colored的shade…...

Docker 查询、停止、删除和重启容器

docker 列出所有容器IDdocker ps -aq[rootlocalhost conf]# docker ps -aq f81aa5f48427 06a66409d7ce 1c3d38b948ba 62233dfad35b 4b0032878886 0f6f368c4c1d 7d98a59a8012 1906ba6bfbe1 [rootlocalhost conf]#docker 查看所有运行容器docker ps -a[rootlocalhost conf]# dock…...

面试历程(3)

1、HashMap为什么要使用红黑树,不能使用平衡二叉树(AVL树) 二叉查找树具有的特性: 左子树上所有结点的值均小于或等于它的根结点的值。右子树上所有结点的值均大于或等于它的根结点的值。左、右子树也分别为二叉排序树。AVL树是严格平衡二叉树(左右两个子树的高度差的绝对…...

【storybook】你需要一款能在独立环境下开发组件并生成可视化控件文档的框架吗?(二)

storybook回顾继续说说用法配置文件介绍回顾 上篇博客地址&#xff1a; https://blog.csdn.net/tuzi007a/article/details/129192502说了部分用法。 继续说说用法 配置文件介绍 开发环境的配置都在.storybook目录中&#xff0c;里面包含了2个文件 main.js preview.js先看m…...

(免费分享)基于ssm的BBS社区论坛系统带论文

项目描述前台部分:1.用户注册登录模块用户登录后,可以进行发帖回帖功能,在线签到功能,完善个人信息,添加好友,收藏贴子,评论帖子,点赞功能,记录功能(比如记录今天发生的事情)等等…2.排行榜模块1.帖子讨论热度排行,分两种排行方式:(1) 根据用户今日发出的帖子被回复数量进行排名…...

RebbitMQ 消息队列(简单使用)

消息队列介绍 MQ的优势 1.业务解耦&#xff1a;不同系统消费信息互不关联&#xff0c;灵活增减系统数量&#xff0c;修改某个系统其他系统也不影响 2.异步提速&#xff1a;不同系统之间可同时响应&#xff0c;提升并发量 3.削峰填谷&#xff1a;处理消息高峰期&#xff0c;均摊…...

OpenCV-Python学习(21)—— OpenCV 图像几何变换之图像翻转(cv.flip、np.flip)

1. 学习目标 学习 OpenCV 图像的翻转函数 cv.flip&#xff1b;学习 NumPy 矩阵的反转函数 np.flip&#xff1b;自己实现矩阵反转的函数。 2. OpenCV 翻转 翻转也称镜像&#xff0c;是指将图像沿轴线进行轴对称变换。水平镜像是将图像沿垂直中轴线进行左右翻转&#xff0c;垂直…...

CRM系统能帮外贸行业解决哪些问题

国内的外贸行业经历了四个发展阶段&#xff0c;从发展期到繁荣期&#xff0c;CRM客户管理系统逐步走到幕前&#xff0c;成为外贸企业必不可少的主打工具。那么外贸行业整面临哪些问题&#xff1f;该如何解决&#xff1f;下面我们就来说说适合外贸行业的CRM解决方案。 外贸行业…...

掌握lombok简化Java编码完成后端提效

Lombok安装 –>添加依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version><scope>provided</scope> </dependency>scopeprovided&#xff0c;说…...