【面试题】MySQL索引相关知识点
1.什么是索引
索引是存储引擎快速查找记录的一种数据结构,就类似书的目录,通过目录可以快速的查找到想要查找的内容
2.索引的特点
-
特点:索引是基于数据引擎的,不同的数据引擎实现索引的方式不一定相同
-
好处:通过索引,可以降低磁盘IO的次数,从而加快查找的效率
-
坏处:
- 创建索引和维护索引要耗费时间 ,并且随着数据量的增加,所耗费的时间也会增加。
- 大量的索引,索引文件就可能比数据文件更快达到最大文件尺寸。(innoDB .ida MyISAM myd数据 myi索引)
- 虽然索引大大提高了查询速度,同时却会降低更新表的速度 。当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。因此,选择使用索引时,需要综合考虑索引的优点和缺点。
3.采用B+树作为索引以后查询一条记录的过程
- 首先在根节点的数据页中,根据每一页里面的页目录(占用连续存储空间),进行二分查找,找到其对应的二级目录页。
- 在二级目录页中采用相同的方法进行查找。直到查找到叶子节点。
- 在叶子节点中,使用二分查找法查找到对应的记录。
4.B+树索引的特点
- 所有节点都存放数据。叶子节点存放用户的记录,非叶子节点用来存放目录项。
- 叶子节点之间通过双链表连接,叶子内部采用单链表连接
5.聚簇索引
- 聚簇索引指的是用户存储的数据都存储在叶子节点上的索引。即索引即数据,数据即索引。
- 常见的有InnoDB中的主键索引就是聚簇索引。
存储内容
- 非叶子节点存储页号以及对应页中主键的最小值。
- 叶子节点存放记录的全部信息
优点:
- 对于使用主键索引进行查找数据的时候相应速度很快,因为数据都已经存储在叶子节点上了
- 对于排序和范围查找都很快。因为本身就是有序的,而且由于数据都在叶子节点,那么直接遍历叶子节点组成的双链表即可。同时减少了大量的IO操作。
缺点:
- 插入速度依赖于插入顺序。如果不按照主键递增顺序插入,那么就会产生页分裂,严重降低插入速度。
- 更新主键的代价很高。可能会产生大量元素的移动。
- 二级索引在访问的时候需要回表操作。
限制
- 由于物理存储方式的限制,同一个表只能有一个聚簇索引。
6.二级索引 非聚簇索引
- 聚簇索引仅仅通过主键检索的时候才会生效,如果想按照别的字段进行检索的话,那么就需要建立非聚簇索引了。
存储内容
- 非叶子节点存储的是索引列的信息以及页号和对应页的最小主键值(为了防止索引列相同时无法判断)
- 叶子节点存储的是索引值,以及对应的主键值,用于回表操作。
对比
- 聚簇索引的叶子节点存储的就是我们的数据记录,非聚簇索引的叶子节点存储的是数据位置。非聚簇索引不会影响数据表的物理存储顺序。
- 一个表只能有一个聚簇索引,因为只能有一种排序存储的方式,但可以有多个非聚簇索引,也就是多个索引目录提供数据检索。
- 使用聚簇索引的时候,数据的查询效率高,但如果对数据进行插入,删除,更新等操作,效率会比非聚簇索引低。
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…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...

麒麟系统使用-进行.NET开发
文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...

表单设计器拖拽对象时添加属性
背景:因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...

RocketMQ 客户端负载均衡机制详解及最佳实践
延伸阅读:🔍「RocketMQ 中文社区」 持续更新源码解析/最佳实践,提供 RocketMQ 专家 AI 答疑服务 前言 本文介绍 RocketMQ 负载均衡机制,主要涉及负载均衡发生的时机、客户端负载均衡对消费的影响(消息堆积/消费毛刺等…...
Caliper 配置文件解析:config.yaml 和 fisco-bcos.json 附加在caliper中执行不同的合约方法
Caliper 配置文件解析:config.yaml 和 fisco-bcos.json Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO…...