xjjdog / interview-ng

下一代Java面试题,精准
0 stars 0 forks source link

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

Open lycying opened 3 years ago

lycying commented 3 years ago

日期:2020-12-10 问题:mysql的索引有哪些种类,使用了什么样的数据结构,为什么要使用这种结构 标签:数据库,数据结构 问题缘由: 经典面试题

lycying commented 3 years ago

面试官你好,mysql我用过的索引有unique normal 主键 组合索引,为什么要用就得说说他们的区别了

lycying commented 3 years ago

从数据结构角度

1、B+树索引(O(log(n))):关于B+树索引,可以参考 MySQL索引背后的数据结构及算法原理

2、hash索引: a 仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询 b 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引 c 只有Memory存储引擎显示支持hash索引

3、FULLTEXT索引(现在MyISAM和InnoDB引擎都支持了)

4、R-Tree索引(用于对GIS数据类型创建SPATIAL索引)

从物理存储角度

1、聚集索引(clustered index)

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

从逻辑角度

1、主键索引:主键索引是一种特殊的唯一索引,不允许有空值

2、普通索引或者单列索引

3、多列索引(复合索引):复合索引指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀集合

4、唯一索引或者非唯一索引

5、空间索引:空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。 MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建

CREATE TABLE table_name[col_name data type]
[unique|fulltext|spatial][index|key][index_name](col_name[length])[asc|desc]

1、unique|fulltext|spatial为可选参数,分别表示唯一索引、全文索引和空间索引;

2、index和key为同义词,两者作用相同,用来指定创建索引

3、col_name为需要创建索引的字段列,该列必须从数据表中该定义的多个列中选择;

4、index_name指定索引的名称,为可选参数,如果不指定,MYSQL默认col_name为索引值;

5、length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;

6、asc或desc指定升序或降序的索引值存储

lycying commented 3 years ago

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

为码农谋福利,替名媛定终身。offer风火轮系列开启,xjjdog将挑选典型高价值题目进行分享。版权声明:本文为群友讨论整理所得,只允许公众号转载,未经授权拒绝拷贝至其他平台。

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

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,欢迎添加好友,​进一步交流。​