我以为我对Mysql索引很了解,直到我遇到了阿里的面试官

用STM32F407做个USB声卡:从CubeMX配置到播放录音全功能实战(附源码) 本文详细介绍了如何使用STM32F407开发板实现USB音频设备的全功能实战,包括CubeMX配置、硬件连接、音频流处理和性能优化。通过双缓冲DMA机制和音频数据处理流程,开发者可以构建高质量的USB声卡系统,适用于录音和播放场景。附源码,助力快速上手STM32音频开发。 阅读详情

相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构。

因为索引是MySQL中比较重点的知识,相信很多人都有一定的了解,尤其是在面试中出现的频率特别高。楼主自认为自己对MySQL的索引相关知识有很多了解,而且因为最近在找工作面试,所以单独复习了很多关于索引的知识。

但是,我还是图样图森破,直到我被阿里的面试官虐过之后我才知道,自己在索引方面的知识,只是个小学生水平。

以下,是我总结的一次阿里面试中关于索引有关的问题以及知识点。

索引概念、索引模型

我们是怎么聊到索引的呢,是因为我提到我们的业务量比较大,每天大概有几百万的新数据生成,于是有了以下对话:

面试官:你们每天这么大的数据量,都是保存在关系型数据库中吗? 我:是的,我们线上使用的是MySQL数据库 面试官:每天几百万数据,一个月就是几千万了,那你们有没有对于查询做一些优化呢? 我:我们在数据库中创建了一些索引(我现在非常后悔我当时说了这句话)。

这里可以看到,阿里的面试官并不会像有一些公司一样拿着题库一道一道的问,而是会根据面试者做过的事情以及面试过程中的一些内容进行展开。

面试官:那你能说说什么是索引吗? 我:(这道题肯定难不住我啊)索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据。 面试官:那么索引具体采用的哪种数据结构呢? 我:(这道题我也背过)常见的MySQL主要有两种结构:Hash索引和B+ Tree索引,我们使用的是InnoDB引擎,默认的是B+树。

这里我耍了一个小心机,特意说了一下索引和存储引擎有关。希望面试官可以问我一些关于存储引擎的问题。

面试官:既然你提到InnoDB使用的B+ Tree的索引模型,那么你知道为什么采用B+ 树吗?这和Hash索引比较起来有什么优缺点吗? 我:(突然觉得这道题有点难,但是我还是凭借着自己的知识储备简单的回答上一些)因为Hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,所以多个数据在存储关系上是完全没有任何顺序关系的,所以,对于区间查询是无法直接通过索引查询的,就需要全表扫描。所以,哈希索引只适用于等值查询的场景。而B+ Tree是一种多路平衡查询树,所以他的节点是天然有序的(左子节点小于父节点、父节点小于右子节点),所以对于范围查询的时候不需要做全表扫描。 面试官:除了上面这个范围查询的,你还能说出其他的一些区别吗? 我:(这个题我回答的不好,事后百度了一下)

科普时间:B+ Tree索引和Hash索引区别 哈希索引适合等值查询,但是不无法进行范围查询 哈希索引没办法利用索引完成排序 哈希索引不支持多列联合索引的最左匹配规则 如果有大量重复键值得情况下,哈希索引的效率会很低,因为存在哈希碰撞问题

聚簇索引、覆盖索引

面试官:刚刚我们聊到B+ Tree ,那你知道B+ Tree的叶子节点都可以存哪些东西吗? 我:InnoDB的B+ Tree可能存储的是整行数据,也有可能是主键的值。 面试官:那这两者有什么区别吗? 我:(当他问我叶子节点的时候,其实我就猜到他可能要问我聚簇索引和非聚簇索引了)在 InnoDB 里,索引B+ Tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。而索引B+ Tree的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引。 面试官:那么,聚簇索引和非聚簇索引,在查询数据的时候有区别吗? 我:聚簇索引查询会更快? 面试官:为什么呢? 我:因为主键索引树的叶子节点直接就是我们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询。

面试官:刚刚你提到主键索引查询只会查一次,而非主键索引需要回表查询多次。(后来我才知道,原来这个过程叫做回表)是所有情况都是这样的吗?非主键索引一定会查询多次吗? 我:(额、这个问题我回答的不好,后来我自己查资料才知道,通过覆盖索引也可以只查询一次)

科普时间——覆盖索引 覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。 当一条查询语句符合覆盖索引条件时,MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。 如,表covering_index_sample中有一个普通索引 idx_key1_key2(key1,key2)。当我们通过SQL语句:select key2 from covering_index_sample where key1 = ‘keytest’;的时候,就可以通过覆盖索引查询,无需回表。

联合索引、最左前缀匹配

面试官:不知道的话没关系,想问一下,你们在创建索引的时候都会考虑哪些因素呢? 我:我们一般对于查询概率比较高,经常作为where条件的字段设置索引 面试官:那你们有用过联合索引吗? 我:用过呀,我们有对一些表中创建过联合索引。 面试官:那你们在创建联合索引的时候,需要做联合索引多个字段之间顺序你们是如何选择的呢? 我:我们把识别度最高的字段放到最前面。 面试官:为什么这么做呢? 我:(这个问题有点把我问蒙了,稍微有些慌乱)这样的话可能命中率会高一点吧。。。 面试官:那你知道最左前缀匹配吗? 我:(我突然想起来原来面试官是想问这个,怪自己刚刚为什么就没想到这个呢。)哦哦哦。您刚刚问的是这个意思啊,在创建多列索引时,我们根据业务需求,where子句中使用最频繁的一列放在最左边,因为MySQL索引查询会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。所以当我们创建一个联合索引的时候,如(key1,key2,key3),相当于创建了(key1)、(key1,key2)和(key1,key2,key3)三个索引,这就是最左匹配原则。

虽然我一开始有点懵,没有联想到最左前缀匹配,但是面试官还是引导了我。很友善。

索引下推、查询优化

面试官:你们线上用的MySQL是哪个版本啊呢? 我:我们MySQL是5.7 面试官:那你知道在MySQL 5.6中,对索引做了哪些优化吗? 不好意思,这个我没有去了解过。(事后我查了一下,有一个比较重要的 :Index Condition Pushdown Optimization)

科普时间—— Index Condition Pushdown(索引下推) MySQL 5.6引入了索引下推优化,默认开启,使用SET optimizer_switch = ‘index_condition_pushdown=off’;可以将其关闭。官方文档中给的例子和解释如下: people表中(zipcode,lastname,firstname)构成一个索引

SELECT * FROM people WHERE zipcode=’95054′ AND lastname LIKE ‘%etrunia%’ AND address LIKE ‘%Main Street%’;

如果没有使用索引下推技术,则MySQL会通过zipcode=’95054’从存储引擎中查询对应的数据,返回到MySQL服务端,然后MySQL服务端基于lastname LIKE ‘%etrunia%’和address LIKE ‘%Main Street%’来判断数据是否符合条件。 如果使用了索引下推技术,则MYSQL首先会返回符合zipcode=’95054’的索引,然后根据lastname LIKE ‘%etrunia%’和address LIKE ‘%Main Street%’来判断索引是否符合条件。如果符合条件,则根据该索引来定位对应的数据,如果不符合,则直接reject掉。 有了索引下推优化,可以在有like条件查询的情况下,减少回表次数。

面试官:你们创建的那么多索引,到底有没有生效,或者说你们的SQL语句有没有使用索引查询你们有统计过吗? 我:这个还没有统计过,除非遇到慢SQL的时候我们才会去排查 面试官:那排查的时候,有什么手段可以知道有没有走索引查询呢? 我:可以通过explain查看sql语句的执行计划,通过执行计划来分析索引使用情况 面试官:那什么情况下会发生明明创建了索引,但是执行的时候并没有通过索引呢? 我:(依稀记得和优化器有关,但是这个问题并没有回答好)

科普时间——查询优化器 一条SQL语句的查询,可以有不同的执行方案,至于最终选择哪种方案,需要通过优化器进行选择,选择执行成本最低的方案。 在一条单表查询语句真正执行之前,MySQL的查询优化器会找出执行该语句所有可能使用的方案,对比之后找出成本最低的方案。这个成本最低的方案就是所谓的执行计划。 优化过程大致如下: 1、根据搜索条件,找出所有可能使用的索引 2、计算全表扫描的代价 3、计算使用不同索引执行查询的代价 4、对比各种执行方案的代价,找出成本最低的那一个

面试官:哦,索引有关的知识我们暂时就问这么多吧。你们线上数据的事务隔离级别是什么呀? 我:(后面关于事务隔离级别的问题了,就不展开了)

感觉是因为我回答的不够好,如果这几个索引问题我都会的话,他还会追问更多,恐怕会被虐的更惨

总结&感悟

以上,就是一次面试中关于索引部分知识的问题以及我整理的答案。感觉这次面试过程中关于索引的知识,自己大概能够回答的内容占70%左右,但是自信完全答对的内容只占50%左右,看来自己索引有关的知识了解的还是不够多。

通过这次面试,发现像阿里这种大厂对于底层知识还是比较看重的,我以前以为关于索引最多也就问一下Hash和B+有什么区别,没想到最后都能问到查询优化器上面。

最后,不管本次面试能不能通过,都非常感谢有这样一次机会,可以让自己看到自己的不足。通过这次面试,我也收获了很多东西。加油!

AISHELL-1中文语音数据集实战:从下载到训练你的第一个ASR模型(附完整代码) 本文详细介绍了如何使用AISHELL-1中文语音数据集从数据准备到训练端到端语音识别模型的全流程。AISHELL-1作为国内首个开源的普通话语音数据集,包含178小时高质量录音,适合中文自动语音识别(ASR)系统开发。文章涵盖数据下载、预处理、Conformer-CTC模型训练、评估及优化策略,并附完整代码实现。 阅读详情

相关推荐

【机械臂算法】基于最小惯性参数集的动力学辨识仿真实践

本文深入探讨了机械臂动力学参数辨识的核心挑战与解决方案,重点阐述了基于最小惯性参数集的理论与方法。通过分析PUMA560实例,详细介绍了利用QR分解法或符号推导法获取可辨识参数集,并系统讲解了从激励轨迹设计、仿真数据采集、线性系统求解到模型验证的完整实践流程,为高精度动力学建模与控制奠定了坚实基础。

weixin_29054399的博客 377

关于索引的最常见的十道面试题

这是一篇关于索引的全方位面试题,一共十道面试题,每一道都是精挑细选,并且解答很仔细,包括一些底层原理和一些小细节都有,快来看看吧!!!

loss_rose777的博客 3万+

Mac Pro M2芯片成功安装麒麟银河高级服务器虚拟机

本人用的是1、Macbook m2pro芯片 16G+5123、安装homebrew、wegt、qemu。

vagatable_XX的博客 3304

精选数据库“索引“常见30道面试题!面试前冲刺

数据库索引在数据库管理系统中起着至关重要的作用,它可以大大提高数据检索操作的性能。面试中,对于数据库索引的深入理解是一个重要的考察点。本文摘要涵盖了关于数据库索引的一系列面试题,涵盖了索引的基本概念、类型、优化和应用等方面的内容。

key_honghao的博客 3638

python基础语法与数据结构

本文摘要: Python基础语法包含输入输出、函数、变量、数据类型及运算符等内容。输入函数input()获取键盘输入并以字符串存储,输出函数print()可格式化输出数据。函数通过def定义,可带参数和返回值,提高代码复用性。变量无需声明类型,可动态赋值。数据类型包括数字、字符串、布尔及复合类型,可通过type()查看。运算符包含算术、赋值等类型,其中复合赋值运算符如+=可简化运算。类型转换函数如int()、str()等可实现显式类型转换。这些基础语法构成Python编程的核心要素。

MM602388的博客 435

CPU进程调度算法【FCFS、SJF、优先级、RR、多级队列、多级反馈队列调度】

目录 一、先到先服务调度: 二、最短作业优先调度: 三、优先级调度: 四、轮转调度: 五、多级队列调度: 六、多级反馈队列调度: CPU调度算法处理的问题是:从就绪队列中选择进程以便为其分配CPU。 一、先到先服务调度: First Come,First Served(FCFS) 定义:先请求CPU的进程首先分配到CPU。FCFS策略可以通过FIFO队列轻松实现。 护航效果:其他所有进程会等待一个大进程释放CPU 非抢占式:一旦CPU分配给了一个进程,该进程就会使用CPU知道释.

马小超 3921

数据库MySQL-索引(含常见面试题)

目录一,什么是索引二,索引的作用三,索引优缺点及场景1,优点2,缺点3,使用场景4,注意事项四,索引的使用1,索引分类2,查看索引3,创建索引 一,什么是索引 二,索引的作用 三,索引优缺点及场景 1,优点 2,缺点 3,使用场景 4,注意事项 四,索引的使用 1,索引分类 (1)主键索引:(聚簇索引) (2)非主键索引:(二级索引) (3)唯一索引 (4) (5) 2,查看索引 3,创建索引 ...

淡沫初夏zz的博客 5421

Win11系统下Abaqus2022与VS2022+oneAPI2023环境配置全攻略(附VUMAT子程序避坑指南)

本文详细指导在Windows 11系统下,为Abaqus 2022配置Visual Studio 2022与Intel oneAPI 2023的Fortran编译环境,以支持VUMAT等用户子程序开发。内容涵盖软件安装顺序、环境变量关联、快捷方式修改及关键验证步骤,并提供了首个VUMAT子程序的实战编写与模型验证方法,帮助用户高效搭建稳定可靠的仿真开发平台。

pytorch8learner的博客 319

MySQL面试题1(索引)

mysql内部提供的额外的索引机制,自动化生成,没办法手动干预,只能在InnoDb上。在高频查询之上,再生成一套索引出来。2-3树表示子节点下面允许存在2个或3个结点2-3-4树表示根节点下有两个结点,两个结点下有3个结点或者4个结点。子结点小于4个也可以,但是不能大于。1.112.9不重启会延续原本的id进行增加,如果重启后会更新,并按照最大id进行插入。show create tabe 表名;会有一个auto_increment=[一个数字];这个数字表示自增id。

市民景先生 2638

【数据集】中国陆地生态系统通量观测网 ChinaFLUX

【数据集】中国陆地生态系统通量观测网 ChinaFLUX

WW、forever的博客 194

工作之余的随想:AI 会终结 SAP 顾问吗?

本文是笔者工作之余的一些胡思乱想。昨晚(准确的说是今日凌晨),我又熬了一个夜。没办法,接到一个影响客户项目上线的紧急 incident,花了我好长时间,竟然一点头绪都没有。苦苦思索的过程,时间过得飞快。一转眼就晚上11:30 了。要说我 2007 年还在研三实习期间,就进入了 SAP 行业,到今天已经摸爬滚打 18 年了,按理说也算身经百战了,可以说处理过很多 SAP 客户使用系统时遇到的各种稀奇古怪的问题。但即便这样,我也时常在工作中遇到一开始感到无从下手的问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1266

MySQL面试题--最全面-索引

回表操作是指在数据库查询过程中,当数据库引擎无法直接从索引中获取所需的数据,需要通过索引查找到数据行的位置,然后再去实际的数据表中获取完整的数据行的过程。我们生成了一个存储更高级目录项的 页33 ,这个页中的两条记录分别代表页30和页32,如果用户记录的主键值在 [1, 320) 之间,则到页30中查找更详细的目录项记录,如果主键值 不小于320 的话,就到页32中查找更详细的目录项记录。需要注意的是,非聚簇索引的查找性能受到多个因素的影响,包括B+树的高度、节点的分裂情况、磁盘I/O操作的效率等。

weixin_46742102的博客 2059

Unity3D实现视频和模型融合效果

在Unity中,视频和3D模型融合通常涉及到将视频表面内嵌到3D场景中。视频不影响模型的展示, 这可以通过使用Shader和Texture来实现。大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。下面就让我们进入正文吧!提示:以下是本篇文章正文内容,下面案例可供参考本次介绍的就是视频和模型融合的实现,以后有其他的需要添加的会继续添加不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒。

心疼你的一切博客 5357

我以为我对Mysql索引很了解,直到我遇到了阿里的面试官,瞬间打脸

前言 本文来自一位不愿意透露姓名的粉丝投稿 相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构。 因为索引是MySQL中比较重点的知识,相信很多人都有一定的了解,尤其是在面试中出现的频率特别高。楼主自认为自己对MySQL的索引相关知识有很多了解,而且因为最近在找工作面试,所以单独复习了很多关于索引的知识。 但是,我还是图样图森破,直到我被阿里的面试官虐过之后我才知道,自己在索引方面的知识,只是个小学生水平。 以下,是我总结的一次阿里面试中关于索引有关的问题以及知

m0_58479800的博客 253

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

原创|我以为我对Mysql索引很了解,直到我遇到了阿里的面试官

本文来自一位不愿意透露姓名的粉丝投稿,由Hollis整理并"还原"了面试现场。相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据...

HollisChuang's Blog 1935

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

我以为自己足够了解MySQL索引,直到遇见阿里面试官……

https://mp.weixin.qq.com/s/yZ133u4np5_OVFC6xesTpA 相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构。 因为索引是MySQL中比较重点的知识,相信很多人都有一定的了解,尤其是在面试中出现的频率特别高。楼主自认为自己对MySQL的索引相关知识有很多了解,而且因为最近在找工作面试,所以单独复习了很...

yangyutong0506的专栏 961
上一篇: 深入理解 Java 虚拟机》读书笔记:Java 内存区域与内存溢出异常
下一篇: Spring Boot 注解大全,真是太全了!
JavaAOE
博客等级 码龄7年 27粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值