欢迎关注公众号 《小姐姐味道》 ,一起进步!

# mysql的索引有哪些?为什么要这么设计?

死磕面试系列。

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

# 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数。因为它的出现频率很高,你大概率会遇到。

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,​进一步交流。​


关注回复 技术 关键字 ,即可 获取 海量资源

鲁ICP备2020043359号-1