MySQL中有多少种索引?索引的底层实现原理是?

84bc85f2c653055920ed47ecc1f2ed50.gif

索引存储在内存中,为服务器存储引擎为了快速找到记录的一种数据结构。索引的主要作用是加快数据查找速度,提高数据库的性能。

 索引的分类 

普通索引:

最基本的索引,它没有任何限制。

唯一索引:

与普通索引类似,不同的就是索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

主键索引:

它是一种特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值,一般用 primary key 来约束。

联合索引(又叫复合索引):

多个字段上建立的索引,能够加速复合查询条件的检索。

全文索引:

老版本 MySQL 自带的全文索引只能用于数据库引擎为 MyISAM 的数据表,新版本 MySQL 5.6 的 InnoDB 支持全文索引。默认 MySQL 不支持中文全文检索,可以通过扩展 MySQL,添加中文全文检索或为中文内容表提供一个对应的英文索引表的方式来支持中文。

 索引结构 

索引是在Mysql的存储引擎(InnoDB,MyISAM)层中实现的,而不是在服务层实现的。所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型的。

Mysql目前提供了以下4种索引:

B+Tree 索引: 

最常见的索引类型, 大部分索引都支持B+树索引。

Hash 索引: 

只有Memory引擎支持, 使用场景简单。

R-Tree索引(空间索引): 

空间索引是MyISAM引擎的一个特殊索引类型, 主要地理空间数据, 使用也很少。

S-Full-text(全文索引): 

全文索引也是MyISAM的一个特殊索引类型, 主要用于全文索引, InnoDB从Mysql5.6版本开始支持全文索引。

0838bad39509944e3c4c5f9b0612d7af.png

 BTree 结构 

B+Tree是在BTree基础上进行演变的,所以我们先来看看BTree,BTree又叫多路平衡搜索树。

一颗m叉BTree特性如下:

(1) 树中每个节点最多包含m个孩子。

(2) 除根节点与叶子节点外, 每个节点至少有[ceil(m/2)] 个孩子(ceil函数指向上取整)。

(3) 若根节点不是叶子节点, 则至少有两个孩子。

(4) 每个非叶子节点由n个Key和n+1个指针组成, 其中 [ceil(m/2) -1 ] <= n <= m-1。

以5叉BTree为例,key的数量: 公式推导 [ceil(m/2) -1 ] <= n <= m-1。

所以 2 <= n <= 4,中间节点分裂父节点,两边节点分裂。

8c812721ab952daa59767b6e101fd1ea.png

 B + Tree 结构 

B+Tree为BTree的变种,B+Tree与BTree的区别:

(1) B+Tree的叶子节点保存所有的key信息, 依key大小顺序排列。

(2) B+Tree叶子节点元素维护了一个单项链表。

所有的非叶子节点都可以看作是key的索引部分。

7a69d802e5a118b06f49e9251c6b8de7.png

由于B+Tree只有叶子节点保存key信息,查询任何key都要从root走的叶子。所以B+Tree查询效率更稳定。

 Mysql中的B+Tree 

MySql索引数据结构对经典的B+Tree进行了优化,在原B+Tree的基础上,增加了一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。

MySql中的B+Tree索引结构示意图:

96b6db9817803d0ee8ffc53134454364.png

fc5d5d5ed5487adad47486213683ff1a.png52dd4411cbb1b5cdaeac9b757683eac2.pngb0af494b24d0780245154607c3d5479b.png

以上就是播妞为大家分享的干货内容

希望对你有所帮助

 黑马程序员 

累计培养30余万名优质IT人才

8大学科火热报名中

基础班仅需 28 元,扫码免费咨询

f6f06c44a99feddc2830fe35f20e695f.png

线上课程咨询联系播妞(微信:heiniu526)

5348f368c5cee57336c2b655bec5032a.png

丨热门教程资源免费领丨

回复【领取资源】领《黑马8学科汇总教程》

回复【1026】领《SpringBoot2全套》

回复【瑞吉外卖】领《瑞吉外卖项目教程》

回复【mysql1】领《Mysql入门到精通》

回复【毕业设计】领《Java毕业设计项目》

更多教程加播妞领取:heiniu526

(在下方公众号回复对应关键词,即可领取哦)

↓↓↓

786b6a5f31bb848fbc25ca92611972c5.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值