Open lycying opened 3 years ago
面试官你好,mysql我用过的索引有unique normal 主键 组合索引,为什么要用就得说说他们的区别了
从数据结构角度
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指定升序或降序的索引值存储
为码农谋福利,替名媛定终身。offer风火轮系列开启,xjjdog将挑选典型高价值题目进行分享。版权声明:本文为群友讨论整理所得,只允许公众号转载,未经授权拒绝拷贝至其他平台。
标签:【中级】【数据库】【数据结构】
mysql的索引有哪些种类,使用了什么样的数据结构,为什么要使用这种结构
这种题目还真的不太好回答,因为它非常考验总结能力。所以这里就总结一下。
从不同的角度去聊,索引的种类也不同。比如:从物理存储角度:会有聚集索引和非聚集索引之分;从数据结构角度:会有B+Tree和Hash等等之分。
不过,鉴于国内通常喜欢聊B+树这一特点,这问题大概率是在考察应聘者对于B+Tree这种设计的折衷。
此问题面试频率高,且涉及非常多的细节。本文只负责你能够pass第一关,不至于一票否决。至于细节方面不予置评,因为那不是一篇文章能说清楚的。
因为答案有不同的角度,你可以挑选一个自己比较熟悉的角度进行回答。注意:本文并不是教会你掌握什么是B+树,而是教你怎么快速回答。
在MySQL中,我见过的有Hash索引
、B+树索引
、FULLTEXT
、R-Tree
等。最常用的就是B+Tree。
为什么这样设计?还得聊一下我们平常的查询需求。如果就查询一条数据,那完全可以使用Hash索引,直接定位就是。但我们的业务查询,大多数涉及多条数据,还要做条件过滤、分组等。
由于数据都存在于磁盘上,在定位数据的时候,最好经过的节点越少越好,也就是树的高度越低越好。这也意味着,树的分叉很多,可以说是一个m叉树。这其实就是B树。
B+树是对B树的一种改进,主要有两点:1. 数据只存储于叶子节点 ;2. 叶子节点之间,增加了横向的链表。
因为SQL中范围查询频繁,所以第二点改进对效率增加最大。
索引类型有聚集索引
和非聚集索引
两种。
1、聚集索引(clustered index) 2、非聚集索引(non-clustered index)
聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。InnoDB的聚簇索引实际上在同一个结构中保存了B+Tree索引和数据行。
MyISAM中主键索引和其他索引,都指向物理行 (非聚簇索引)。
为什么这么设计?还是和性能有关。对于聚簇索引来说,索引的顺序就是数据存放的顺序,在查找的时候可以减少IO。在这种情况下,主键使用自增ID的效率会比UUID的效率高。
逻辑角度是实际的使用角度。分为:主键索引、普通索引、复合索引。
谈到符合索引,就必须要说一下它的最左匹配原则。
比如,有a、b、c三个字段,如果我想要根据abc进行查询,同时也根据ab进行查询,那就仅仅创建一个abc符合索引就可以。
使用的时候,a、ab、abc相关的查询,都会走这一个索引。但是如果只查询b,是不走这个索引的。
为什么要这么设计?
复合索引是为了减少开销,多个索引合并成一个索引,既减少了存储空间,又增加了检索效率。
由于此题有三种不同的角度,会增加问题的复杂度。一般的面试官,会直接问到具体的分支,比如:聚簇索引和非聚簇索引的区别。
优先掌握B+ Tree,它是一个必须要掌握的数据结构,面试之前,心里要有点B数。因为它的出现频率很高,你大概率会遇到。
作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。
日期:2020-12-10 问题:mysql的索引有哪些种类,使用了什么样的数据结构,为什么要使用这种结构 标签:数据库,数据结构 问题缘由: 经典面试题