当前位置: 首页 > 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…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...

【若依】框架项目部署笔记

参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作&#xff1a; 压缩包下载&#xff1a;http://download.redis.io/releases 1. 上传压缩包&#xff0c;并进入压缩包所在目录&#xff0c;解压到目标…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...

DAY 45 超大力王爱学Python

来自超大力王的友情提示&#xff1a;在用tensordoard的时候一定一定要用绝对位置&#xff0c;例如&#xff1a;tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾&#xff1a; tensorboard的发展历史和原理tens…...