死磕面试系——mysql的索引有哪些?为什么要这么设计?

48 篇文章 1 订阅
46 篇文章 0 订阅

 

标签:【中级】【数据库】【数据结构】

1. 问

mysql的索引有哪些种类,使用了什么样的数据结构,为什么要使用这种结构

2. 分析

这种题目还真的不太好回答,因为它非常考验总结能力。所以这里就总结一下。

从不同的角度去聊,索引的种类也不同。比如:从物理存储角度:会有聚集索引和非聚集索引之分;从数据结构角度:会有B+Tree和Hash等等之分。

不过,鉴于国内通常喜欢聊B+树这一特点,这问题大概率是在考察应聘者对于B+Tree这种设计的折衷。

此问题面试频率高,且涉及非常多的细节。本文只负责你能够pass第一关,不至于一票否决。至于细节方面不予置评,因为那不是一篇文章能说清楚的。

3. 答

因为答案有不同的角度,你可以挑选一个自己比较熟悉的角度进行回答。注意:本文并不是教会你掌握什么是B+树,而是教你怎么快速回答。

3.1 常见数据结构角度回答

在MySQL中,我见过的有Hash索引B+树索引FULLTEXTR-Tree等。最常用的就是B+Tree。

为什么这样设计?还得聊一下我们平常的查询需求。如果就查询一条数据,那完全可以使用Hash索引,直接定位就是。但我们的业务查询,大多数涉及多条数据,还要做条件过滤、分组等。

由于数据都存在于磁盘上,在定位数据的时候,最好经过的节点越少越好,也就是树的高度越低越好。这也意味着,树的分叉很多,可以说是一个m叉树。这其实就是B树。

B+树是对B树的一种改进,主要有两点:1. 数据只存储于叶子节点 ;2. 叶子节点之间,增加了横向的链表。

因为SQL中范围查询频繁,所以第二点改进对效率增加最大。

3.2 物理角度回答

索引类型有聚集索引非聚集索引两种。

1、聚集索引(clustered index) 2、非聚集索引(non-clustered index)

聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。InnoDB的聚簇索引实际上在同一个结构中保存了B+Tree索引和数据行。

MyISAM中主键索引和其他索引,都指向物理行 (非聚簇索引)。

为什么这么设计?还是和性能有关。对于聚簇索引来说,索引的顺序就是数据存放的顺序,在查找的时候可以减少IO。在这种情况下,主键使用自增ID的效率会比UUID的效率高。

3.3 从逻辑角度回答

逻辑角度是实际的使用角度。分为:主键索引、普通索引、复合索引。

谈到符合索引,就必须要说一下它的最左匹配原则。

比如,有a、b、c三个字段,如果我想要根据abc进行查询,同时也根据ab进行查询,那就仅仅创建一个abc符合索引就可以。

使用的时候,a、ab、abc相关的查询,都会走这一个索引。但是如果只查询b,是不走这个索引的。

为什么要这么设计?

复合索引是为了减少开销,多个索引合并成一个索引,既减少了存储空间,又增加了检索效率。

4. 扩展

由于此题有三种不同的角度,会增加问题的复杂度。一般的面试官,会直接问到具体的分支,比如:聚簇索引和非聚簇索引的区别。

优先掌握B+ Tree,它是一个必须要掌握的数据结构,面试之前,心里要有点B数。因为它的出现频率很高,你大概率会遇到。

求关注
欢迎大家关注我的 B站账号
B站账号
如果内容有帮到你,欢迎大家点赞、收藏 + 关注

学习交流群
交流群

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值