面试官问我MySQL索引,我真的是

我以为我对Mysql索引很了解,直到我遇到了阿里的面试官 本文来自一位不愿意透露姓名的粉丝投稿 相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构。 因为索引是MySQL中比较重点的知识,相信很多人都有一定的了解,尤其是在面试中出现的频率特别高。楼主自认为自己对MySQL的索引相关知识有很多了解,而且因为最近在找工作面试,所以单独复习了很多关于索引的知识。 但是,我还是图样图森破,直到我被阿里的面试官虐... 阅读详情

面试官:我看你简历上写了MySQL,对MySQL InnoDB引擎的索引了解吗?

候选者:嗯啊,使用索引可以加快查询速度,其实上就是将无序的数据变成有序(有序就能加快检索速度)

候选者:在InnoDB引擎中,索引的底层数据结构是B+树

面试官:那为什么不使用红黑树或者B树呢?

候选者:MySQL的数据是存储在硬盘的,在查询时一般是不能「一次性」把全部数据加载到内存中

候选者:红黑树是「二叉查找树」的变种,一个Node节点只能存储一个Key和一个Value

候选者:B和B+树跟红黑树不一样,它们算是「多路搜索树」,相较于「二叉搜索树」而言,一个Node节点可以存储的信息会更多,「多路搜索树」的高度会比「二叉搜索树」更低。

候选者:了解了区别之后,其实就很容易发现,在数据不能一次加载至内存的场景下,数据需要被检索出来,选择B或B+树的理由就很充分了(一个Node节点存储信息更多(相较于二叉搜索树),树的高度更低,树的高度影响检索的速度)

候选者:B+树相对于B树而言,它又有两种特性。

候选者:一、B+树非叶子节点不存储数据,在相同的数据量下,B+树更加矮壮。(这个应该不用多解释了,数据都存储在叶子节点上,非叶子节点的存储能存储更多的索引,所以整棵树就更加矮壮)

候选者:二、B+树叶子节点之间组成一个链表,方便于遍历查询(遍历操作在MySQL中比较常见)

候选者:我稍微解释一下吧,你可以脑补下画面

候选者:我们在MySQL InnoDB引擎下,每创建一个索引,相当于生成了一颗B+树。

候选者:如果该索引是「聚集(聚簇)索引」,那当前B+树的叶子节点存储着「主键和当前行的数据」

候选者:如果该索引是「非聚簇索引」,那当前B+树的叶子节点存储着「主键和当前索引列值」

候选者:比如写了一句sql:select * from user where id >=10,那只要定位到id为10的记录,然后在叶子节点之间通过遍历链表(叶子节点组成的链表),即可找到往后的记录了。

候选者:由于B树是会在非叶子节点也存储数据,要遍历的时候可能就得跨层检索,相对麻烦些。

候选者:基于树的层级以及业务使用场景的特性,所以MySQL选择了B+树作为索引的底层数据结构。

候选者:对于哈希结构,其实InnoDB引擎是「自适应」哈希索引的(hash索引的创建由InnoDB存储引擎引擎自动优化创建,我们是干预不了)

面试官:嗯…那我了解了,顺便想问下,你知道什么叫做回表吗?

候选者:所谓的回表其实就是,当我们使用索引查询数据时,检索出来的数据可能包含其他列,但走的索引树叶子节点只能查到当前列值以及主键ID,所以需要根据主键ID再去查一遍数据,得到SQL 所需的列

候选者:举个例子,我这边建了给订单号ID建了个索引,但我的SQL 是:select orderId,orderName from orderdetail where orderId = 123

候选者:SQL都订单ID索引,但在订单ID的索引树的叶子节点只有orderId和Id,而我们还想检索出orderName,所以MySQL 会拿到ID再去查出orderName给我们返回,这种操作就叫回表

候选者:想要避免回表,也可以使用覆盖索引(能使用就使用,因为避免了回表操作)。

候选者:所谓的覆盖索引,实际上就是你想要查出的列刚好在叶子节点上都存在,比如我建了orderId和orderName联合索引,刚好我需要查询也是orderId和orderName,这些数据都存在索引树的叶子节点上,就不需要回表操作了。

面试官:既然你也提到了联合索引,我想问下你了解最左匹配原则吗?

候选者:嗯,说明这个概念,还是举例子比较容易说明

候选者:如有索引 (a,b,c,d),查询条件 a=1 and b=2 and c>3 and d=4,则会在每个节点依次命中a、b、c,无法命中d

候选者:先匹配最左边的,索引只能用于查找key是否存在(相等),遇到范围查询 (>、<、between、like左匹配)等就不能进一步匹配了,后续退化为线性查找

候选者:这就是最左匹配原则

面试官:嗯嗯,我还想问下你们主键是怎么生成的?

候选者:主键就自增的

面试官:那假设我不用MySQL自增的主键,你觉得会有什么问题呢?

候选者:首先主键得保证它的唯一性和空间尽可能短吧,这两块是需要考虑的。

候选者:另外,由于索引的特性(有序),如果生成像uuid类似的主键,那插入的的性能是比自增的要差的

候选者:因为生成的uuid,在插入时有可能需要移动磁盘块(比如,块内的空间在当前时刻已经存储满了,但新生成的uuid需要插入已满的块内,就需要移动块的数据)

面试官:OK…

本文总结:

  • 为什么B+树?数据无法一次load到内存,B+树是多路搜索树,只有叶子节点才存储数据,叶子节点之间链表进行关联。(树矮,易遍历)
  • 什么是回表?非聚簇索引在叶子节点只存储列值以及主键ID,有条件下尽可能用覆盖索引避免回表操作,提高查询速度
  • 什么是最左匹配原则?从最左边为起点开始连续匹配,遇到范围查询终止
  • 主键非自增会有什么问题?插入效率下降,存在移动块的数据问题

【对线面试官-移动端】系列 一周两篇持续更新中!

【对线面试官-电脑端】系列 一周两篇持续更新中!

原创不易!!求三连!!

OpenPCDet安装及其3D检测算法实现 OpenPCDet及pointpillar复现 阅读详情

相关推荐

Django 小实例S1 简易学生选课管理系统 —— 〇、初步介绍与演示

python Django实现的一个简易的教务选课系统。 介绍与演示的视频版本已发到我的b站: https://www.bilibili.com/video/BV1er4y1w7ty。 项目已上传到我的github: https://github.com/BigShuang/SimpleStudentCourseManagementSystem。 S1总目录: 〇、初步介绍与演示 一、项目流程梳理与数据库设计 ======================= 大爽歌作,made by big shuang.

大爽老师的博客 5944

面试官:要不简单聊一下你对MySQL索引的理解?

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33860737的博客 815

TSMC40nmLP版图实战:从Design Rule解读到Cadence高效布局布线

本文详细解析了TSMC40nmLP工艺的版图设计实战,从Design Rule解读到Cadence高效布局布线技巧。重点介绍了40nm工艺中的关键设计规则,如最小线宽、间距规则和深N阱规则,并分享了Cadence Virtuoso中的高效工作流和射频模块设计技巧,帮助工程师提升版图设计效率和质量。

weixin_29250403的博客 378

面试官mysql的索引了解多少,这一次我不会再被问懵了

mysql数据库我相信基本大部分公司会选择mysql数据库,作为存储引擎。 MySQL 数据库管理系统具有以下系统特性: 使用 C 和 C++ 编写,并使用多种编译器进行测试,保证源代码的可移植性。 支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows 等多种操作系统。 为多种编程语言提供了 API。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Rub

566

Vue项目实战:用DataV的dv-scroll-board打造高颜值滚动表格(附完整代码)

本文详细介绍了如何在Vue项目中使用DataV的dv-scroll-board组件打造高颜值滚动表格。从基础集成到高级配置,包括动态数据处理、深度样式定制、性能优化策略以及交互增强方案,帮助开发者快速实现企业级数据展示需求。特别针对样式优化和滚动表格的常见问题提供了实用解决方案。

weixin_30892037的博客 496

rv1106 模型部署

ONNX(Open Neural Network Exchange),开放神经网络交换,是一种模型IR,用于在各种深度学习训练和推理框架转换的一个中间表示格式,支持多种深度学习框架,包括 TensorFlow、PyTorch、Caffe 等。将模型转换为 ONNX 格式后,可以更容易地在不同的深度学习框架中进行部署和推理,而无需重新训练模型。

weixin_50993868的博客 1285

对数据库索引的理解

1、首先要明白无名无实莫要用索引:因为数据中的记录很多,为了方便我们查找,提高查询的效率; 2、索引的原理:对要查询的字段建立索引其实就是把该字段按照一定的方式排序;建立的索引只对该字段有用,如果查询的字段改变,那么这个索引也就无效了,比如图书馆的书是按照书名的第一个字母排序的,那么你想要找作者叫张三的就不能用改索引了;还有就是如果索引太多会降低查询的速度 3、索引是优缺点:   首先明白为什...

weixin_33889245的博客 994

STC51单片机串口多字节数据接收的优化策略

本文深入探讨了STC51单片机串口多字节数据接收的优化策略。针对数据丢包、粘包等常见痛点,核心思路是采用“缓冲队列+定时器超时”模式,将实时处理转变为“先收纳,后处理”。文章详细讲解了硬件初始化、中断服务程序优化(快速入队与激活超时裁判)以及主循环的非阻塞设计,并进阶介绍了环形缓冲区实现与错误处理,旨在构建稳定可靠的串口通信系统。

weixin_29264201的博客 373

面试官:MySQL索引底层数据结构原理与性能调优,你能回答多少?

面试官:听说你精通MySQL,那来和我大战三百个回合吧!

真正的大师永远怀着一颗学徒的心 1万+

医学图像可视化实战:ITK-SNAP与Python+SimpleITK双方案解析

本文深入解析了医学图像可视化的两大核心方案:ITK-SNAP与Python+SimpleITK。ITK-SNAP作为专业无损浏览器,是数据探索与分析的必备工具;而Python+SimpleITK方案则提供了自动化处理能力,但需注意将.nii.gz数据转换为JPG等格式时的信息损失。文章通过实战对比,为医学影像处理者提供了清晰的选择指南与避坑建议。

ol789012的博客 490

C#跨平台制图新纪元:Mapsui,一库在手,地图我有

深入学习Mapsui的渲染机制,定制属于你的地图样式,无论是颜色、图标还是文字,都可以随心所欲。

java专栏 1455

面试官:谈谈你对mysql索引的认识?

引言 大家好,我渣渣烟。我曾经写过一篇《面试官:谈谈你对表设计的认识?》于是呢,决定再来一个mysql的数据库专题,这篇我们就来谈谈关于索引方面的mysql面试题。还是老规矩,讲的是在Innodb存储引擎下的情形,毕竟我还真没用过Mysiam之类的存储引擎。ps:其实很早就想写了,一直偷懒! 其实这下面每个问题,我都可以讲一篇文章出来!而且这些问题,不是我凭空编的。如下图所示(注意看第三题) ...

孤独烟 2万+

基于Spring Boot + Vue 3的前后端分离教材订购系统设计与实现

随着高校信息化建设的不断深入,传统手工管理教材的方式已无法满足高效、准确、透明的需求。文章将详细阐述系统的需求分析、架构设计、数据库设计、核心功能模块的实现(包括用户认证、教材管理、购物车、订单管理等),并提供关键代码片段。一个集中化、在线化的教材订购系统可以有效地解决这些问题,实现教材信息的统一管理、学生在线选书、订单自动汇总、财务清晰对账,极大地提升了管理效率和服务质量。系统采用了先进的前后端分离架构,实现了用户管理、教材管理、购物车、订单管理等核心功能,具有良好的可扩展性和可维护性。

2201_76125393的博客 330

面试官出的MySQL索引问题,这篇文章全给你解决!

原文链接:blog.ouyangsihai.cn >> MySQL的B 树索引的概念、使用、优化及使用场景 0 前言 这篇文章不会讲解索引的基础知识,主要是关于MySQL数据库的B 树索引的相关原理,里面的一些知识都参考了MySQL技术内幕这本书,也算对于这些知识的总结。对于B树和B 树相关的知识,可以参考我的这篇博客:面试官问你B树和B 树,就把这篇文章丢给他 1 索引的管理 索引有很...

好好学java 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

面试官问我MySQL索引

面试官:我看你简历上写了MySQL,对MySQL InnoDB引擎的索引了解吗?候选者:嗯啊,使用索引可以加快查询速度,其实上就是将无序的数据变成有序(有序就能加快检索速度)候选者:在InnoDB引擎中,索引的底层数据结构是B+树面试官:那为什么不使用红黑树或者B树呢?候选者:MySQL的数据是存储在硬盘的,在查询时一般是不能「一次性」把全部数据加载到内存中候选者:红黑树是「二叉查找树」的变种,一个Node节点只能存储一个Key和一个Value候选者:B和B+树跟红黑树不一样,它们算是「多路搜索树」,相较于

m0_67322837的博客 252

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

面试官问我MySQL调优,我真的是

醉了醉了

3y 870

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【MySQL系列2】深入分析MySQL索引的存储结构和优化方案,看完这篇再也不怕面试官问索引了

InnoDB和MyISAM中索引存储的区别前言存储引擎介绍InnoDB引擎MyISAM引擎 前言 上一篇,我们介绍了MySQL为什么最终选择了B+树来作为索引存储的数据结构,想要详细了解,请点击这里。本文将为大家介绍一下B+树在MySQL中是如何落地的,本文主要会对比常用的两种存储引擎InnoDB和MyISAM来进行比较分析。 存储引擎介绍 MySQL的存储引擎是插件式管理的,我们可以自由选择,MySQL中常用的搜索引擎有很多种,但是最常用的就是InnoDB和MyISAM,其他搜索引擎不在本文内容之列,就不

zwx900102的博客 5359

面试官问我:说一下你对MySQL索引的理解?

MySQL索引?这玩意儿还能简单聊?明显是在挖坑,幸好老夫早有准备,且听我一一道来。 一、索引是什么? 索引是帮助MySQL高效获取数据的数据结构。 二、索引能干什么? 索引非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引能够轻易将查询性能提高好几个数量级,总的来说就是可以明显的提高查询效率。 三、索引的分类? 1、从存储结构上来划分:BTree索引(B-T...

小马哥的博客 2082

【Mysql】快来看看面试官最喜欢问的Mysql索引知识啦

通过这篇文章,我们深入了解了 MySQL 中的几种常见索引类型及其实现方式。重点讲解了 MySQL 数据存储结构中的聚簇索引和辅助索引,详细介绍了 B+ 树在 MySQL 中的应用及其优势。MySQL 数据存储结构MySQL 主要通过聚簇索引来存储全部数据。聚簇索引是一种数据存储方式,不是一种单独的索引类型。聚簇索引的实现方式数据行存储在索引的叶子页中,主键值与相邻数据行紧密存储。推荐使用自增主键,避免无规则的 UUID 以减少页分裂。B+ 树MySQL 使用 B+ 树作为数据存储结构。

不堪提 1254

面试官问我MySQL索引,我

面试官:我看你简历上写了MySQL,对MySQL InnoDB引擎的索引了解吗? 候选者:嗯啊,使用索引可以加快查询速度,其实上就是将无序的数据变成有序(有序就能加快检索速度) 候选者:在InnoDB引擎中,索引的底层数据结构是B+树 面试官:那为什么不使用红黑树或者B树呢? 候选者:MySQL的数据是存储在硬盘的,在查询时一般是不能「一次性」把全部数据加载到内存中 候选者:红黑树是「二叉查找树」的变种,一个Node节点只能存储一个Key和一个Value 候选者:B和B+树跟红黑树不一样,它们算是「多路搜索

vx539413949的博客 101

【088期】面试官问:MySQL 创建索引需要遵循哪些原则?

说句实话,如果一个打工人不想提升自己,那便没有工作的意义,毕竟大家也没有到养老的年龄。当你的技术在一步步贴近阿里p7水平的时候,毫无疑问你的薪资肯定会涨,同时你能学到更多更深的技术,交结到更厉害的大牛。推荐一份Java架构之路必备的学习笔记,内容相当全面!!!成年人的世界没有容易二字,前段时间刷抖音看到一个程序员连着加班两星期到半夜2点的视频。在这个行业若想要拿高薪除了提高硬实力别无他法。你知道吗?现在有的应届生实习薪资都已经赶超开发5年的程序员了,实习薪资26K,30K,你没有紧迫感吗?

2401_84048179的博客 977

妙啊!真实模拟面试 — 面试官究竟会怎么问 数据库索引呢?

什么是索引? 面试官:我看你项目中有做过 SQL 优化,那我们今天就来聊聊索引吧。 (索引能问些啥,无非是索引的概念、索引的使用规则、索引的分类、索引的原理。嘻嘻~我早有准备) 我:数据库中的索引,简单来说呐,就好比一本书的目录,它可以帮我们快速进行特定值的定位与查找,从而加快数据查询的效率。 如果我们不使用索引,就必须从第 1 条记录开始依次往后查找,直到把所有的数据表都查找完,才能找到想要的数据。 记得点赞收藏加关注哦 ,需要下载PDF版本和更多知识点、面试题的朋友可以点一点下方链接免费领取 链接:点

XingXing_Java的博客 3867
上一篇: Kafka丢数据、重复消费、顺序消费的问题
下一篇: 面试官一口气问了MySQL事务、锁和MVCC,我
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值