数据结构论坛

首页 » 分类 » 常识 » MySQL大厂面试10分钟掌握MySQL
TUhjnbcbe - 2025/4/30 16:53:00
北京哪家看白癜风最好 https://wapjbk.39.net/yiyuanzaixian/bjzkbdfyy/

导读:大家肯定都知道,索引是MySQL高效查询数据的一种数据结构。而且面试也常问,因为在MySQL中占比比较重,我相信很多人对它了解也都很透彻,真的透彻吗?这篇写给最近在找工作的朋友们。

MySQL在面试中的方方面面(中级水平)

面试题只解答三道题,其余的大家看看会几道,不会的在评论区留言,为你解答。

前几天笔者发布了几篇关于索引的一些文章,如果感兴趣可以去学习一下:

下面是笔者总结出来的中级MySQL索引面试题,如果你遇到更好的问题欢迎在下方留言。

No.1面试官:你可以简单说说什么是索引吗?

答:索引,是存储引擎用于快速找到记录的一种数据结构,类似新华字典的目录。MyIsAm是采用的非聚集索引,而InnoDB采用的是聚集索引。比如字典中有拼音查找法,有笔画查找法,不同的检索方式也就等于MySQL中不同的数据检索结构,相对的MySQL中常用的有B、B+tree还有hash。

No.2面试官:那么你可以说说索引具体都有哪几种数据结构吗?

答:在MySQL中数据结构有好多种,比如二分数据结构、平衡二叉树数据结构,但是工作中常用的也就两种数据结构,一种是Hash索引,另一种就是B+tree索引,在MySQL中INNODB引擎默认的数据结构就是B+tree。

二分查找法原理是先将记录按顺序排列,查找时先按序列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将查询范围缩小为左半部分;如果要找的元素值大于该中点元素,则将查询范围缩小为右半部分。以此类推,直到查到需要的值。

平衡二叉树这种数据结构从字面意思就可以知道,树两边的内容是平衡的,二叉查找树中,左子树的键值总是小于根的键值,右子树的键值总是大于根的键值,并且每个节点最多只有两颗子树。平衡二叉树的定义就是满足二叉查找树的定义,另外必须满足任何节点的两个子树的高度差最大为1。从理论上来说二叉树的查找速度和比对速度都是最快的。

深入聊聊B树与B+树以及为什么不用二叉树。

b树(balancetree)和b+树都是应用在数据库数据检索结构中的一种算法,可以认为是m叉的多路平衡查找树,但是从理论上讲,二叉树查找速度和比较次数都是最小的,我们不用二叉树查找的原因是因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。

B树可以理解为一个节点可以拥有多于2个子节点的多叉查找树。B树中同一键值不会出现多次,要么在叶节点,要么在叶的子节点。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。

B+树是B树的变体,定义基本与B树一致,但是查询性能更好。

B+与B树最大的区别就是B+树它的键一定会出现在叶子节点上,同时也有可能在非叶子节点中重复出现。而B树中同一键值不会重复出现。

B+树索引最大的优点就是可以加快数据查询速度,存储引擎在查询的数据的时候不需要走全表扫描,它是从索引的根节点开始进行搜索,然后根据指针逐层的向下查找数据,通过比较节点页的值和目标值就可以找到合适的指针进入下一层节点,而这些指针实际上定义了子节点页中值的上限和下限。B+树更适合做范围查询,因为b+tree对索引是进行顺序存储的。

B+索引是使用场景一般有7点。

1.全值匹配查询的时候会用到,比如查询name=nick;

2.匹配最左浅醉查询的时候也会用到,比如为a列和b列设置联合索引,只要联合索引的第一列(a列)符合查询条件,索引就会被用到,若只是第二列(b列)符合条件则不会被用到该索引。wherea=nickandb=男会用到。

3.匹配列前缀查询会用到,比如只匹配某一列的开头部分。

4.匹配某一列范围值的时候会用到。

5.精准匹配某一列并范围匹配另外一列会用到。

6.只访问索引的查询会用到。在这里指的就是覆盖索引,只需要访问索引,而无需访问数据行。

7.用于查询中的orderby操作。索引树中的节点是有序的。一般来说,若B-Tree可以按照某种方式查找到该值,那么也可以用这种方式用于排序。所以,如果orderby子句中满足前面列出的几种查询类型,则这个索引也可以满足对应的排序需求。

B-Tree索引的限制

1、若不是按照索引的最左列开始查找,则无法使用该索引

比如建立联合索引(name、phone_num),若搜索phone_num则无法使用该索引

2、使用索引时,不能跳过索引中的列

比如建立联合索引(name、phone_num、addr),若搜索name和addr则无法使用该索引只能使用那么过滤

3、notin和操作无法使用该索引

4、若查询中有某个列的范围查询,则其右边的所有列都无法使用索引

注意:存储引擎用不同的方式使用B-Tree索引,性能也各有不同,各有优劣。例如,MyISAM使用前缀压缩的技术使得索引更小,但InnoDB则按照原数据格式进行存储。

MyISAM索引通过数据的物理位置引用被索引的行,而InnoDB则根据逐渐引用被索引的行。

No.3面试官:平时添加过索引吗?你是怎么评估表在什么情况下需要添加索引,以及你是怎么确定要添加哪种索引的?

No.4面试官:既然知道Innodb默认使用B+Tree数据结构,那么可以说说为什么使用B+树吗?

No.5B+树和Hash、B树比起来有哪些优缺点吗?

No.6面试官:你知道B+tree都可以存放哪些东西吗?而且它们都有哪些区别呢?

No.7面试官:可以说说你对聚集索引和非聚集索引的理解吗?

No.8面试官:在平时你们创建索引的时候都会考虑哪些因素呢?

No.9面试官:有用过联合索引和,可以简单说说吗?

No.10面试官:知道索引的最左侧匹配吗?

No.11面试官:可以说说MySQL各个版本索引的区别吗?

No.12面试官:你们创建那么多索引,平时是如何查看排查索引有么有生效呢?

No.13面试官:什么情况下会发生索引明明创建了,但是执行的时候并没有走索引呢?

No.14面试官:添加索引为什么可以加速数据的检索?

No.15面试官:建立对其他操作有么有影响呢?比如删除或者修改。

No.16面试官:索引对聚合函数有效果吗?

No.17面试官:count(*)会使用到索引吗?

No.18面试官:知道索引对排序有哪些影响吗?

No.19面试官:可以简单说说MySQL唯一索引和普通索引的区别吗?

No.20面试官:给某个字段建立索引的时候,普通索引和唯一索引如何抉择呢?

No.21面试官:哪种索引结构会产生二次查询呢?为什么?

No.22面试官:如果出现了二次查询,那么如何可以避免回表呢?

No.23面试官:MySQL里面主要有哪些索引呢?

No.24面试官:表在哪种情况下需要加索引?加哪种索引合适是如何判断的?

1
查看完整版本: MySQL大厂面试10分钟掌握MySQL