♥️作者:小刘在C站
♥️个人主页:小刘主页
♥️每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生!
♥️树高千尺,落叶归根人生不易,人间真情
目录
索引
1 索引概述
1.1 介绍
2 演示
1). 无索引情况
2). 有索引情况
1.3 特点
2 索引结构
2.1 概述
2.2 二叉树
2.3 B-Tree
特点:
2.4 B+Tree
2.5 Hash
1). 结构
2). 特点
3). 存储引擎支持
索引
1 索引概述
1.1 介绍
索引(
index
)是帮助
MySQL
高效获取数据的数据结构
(
有序
)
。在数据之外,数据库系统还维护着满足
index
)是帮助
MySQL
高效获取数据的数据结构
(
有序
)
。在数据之外,数据库系统还维护着满足
特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构
上实现高级查找算法,这种数据结构就是索引。
一提到数据结构,大家都会有所担心,担心自己不能理解,跟不上节奏。不过在这里大家完全不用担
心,我们后面在讲解时,会详细介绍。
心,我们后面在讲解时,会详细介绍。
2 演示
表结构及其数据如下:
假如我们要执行的SQL语句为 : select * from user where age = 45;
1). 无索引情况
在无索引情况下,就需要从第一行开始扫描,一直扫描到最后一行,我们称之为 全表扫描,性能很低。
2). 有索引情况
如果我们针对于这张表建立了索引,假设索引结构就是二叉树,那么也就意味着,会对
age
这个字段建
age
这个字段建
立一个二叉树的索引结构。
此时我们在进行查询时,只需要扫描三次就可以找到数据了,极大的提高的查询的效率。
备注: 这里我们只是假设索引的结构是二叉树,介绍一下索引的大概原理,只是一个示意图,并不是索引的真实结构,索引的真实结构,后面会详细介绍。
1.3 特点
2 索引结构
2.1 概述
MySQL
的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种:
的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种:
上述是
MySQL
中所支持的所有的索引结构,接下来,我们再来看看不同的存储引擎对于索引结构的支持情况。
MySQL
中所支持的所有的索引结构,接下来,我们再来看看不同的存储引擎对于索引结构的支持情况。
注意: 我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引
2.2 二叉树
假如说
MySQL
的索引结构采用二叉树的数据结构,比较理想的结构如下:
MySQL
的索引结构采用二叉树的数据结构,比较理想的结构如下:
如果主键是顺序插入的,则会形成一个单向链表,结构如下:
所以,如果选择二叉树作为索引结构,会存在以下缺点:
顺序插入时,会形成一个链表,查询性能大大降低。
大数据量情况下,层级较深,检索速度慢
此时大家可能会想到,我们可以选择红黑树,红黑树是一颗自平衡二叉树,那这样即使是顺序插入数
据,最终形成的数据结构也是一颗平衡的二叉树
,
结构如下
:
,
结构如下
:
但是,即使如此,由于红黑树也是一颗二叉树,所以也会存在一个缺点:
但是,即使如此,由于红黑树也是一颗二叉树,所以也会存在一个缺点:
所以,在
MySQL
的索引结构中,并没有选择二叉树或者红黑树,而选择的是
B+Tree
,那么什么是
MySQL
的索引结构中,并没有选择二叉树或者红黑树,而选择的是
B+Tree
,那么什么是
B+Tree
呢?在详解
B+Tree
之前,先来介绍一个
B-Tree
。
呢?在详解
B+Tree
之前,先来介绍一个
B-Tree
。
2.3 B-Tree
B-Tree
,
B
树是一种多叉路衡查找树,相对于二叉树,
B
树每个节点可以有多个分支,即多叉。
,
B
树是一种多叉路衡查找树,相对于二叉树,
B
树每个节点可以有多个分支,即多叉。
以一颗最大度数(
max-degree
)为
5(5
阶
)
的
b-tree
为例,那这个
B
树每个节点最多存储
4
个
key
,
5
max-degree
)为
5(5
阶
)
的
b-tree
为例,那这个
B
树每个节点最多存储
4
个
key
,
5
个指针:
小知识: 树的度数指的是一个节点的子节点个数。
插入一组数据:
100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88
100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88
120 268 250
。然后观察一些数据插入过程中,节点的变化情况。
。然后观察一些数据插入过程中,节点的变化情况。
特点:
5
阶的
B
树,每一个节点最多存储
4
个
key
,对应
5
个指针。
阶的
B
树,每一个节点最多存储
4
个
key
,对应
5
个指针。
一旦节点存储的
key
数量到达
5
,就会裂变,中间元素向上分裂。
key
数量到达
5
,就会裂变,中间元素向上分裂。
在
B
树中,非叶子节点和叶子节点都会存放数据。
B
树中,非叶子节点和叶子节点都会存放数据。
2.4 B+Tree
B+Tree
是
B-Tree
的变种,我们以一颗最大度数(
max-degree
)为
4
(
是
B-Tree
的变种,我们以一颗最大度数(
max-degree
)为
4
(
4
阶)的
b+tree
为例,来看一下其结构示意图:
阶)的
b+tree
为例,来看一下其结构示意图:
我们可以看到,两部分:
绿色框框起来的部分,是索引部分,仅仅起到索引数据的作用,不存储数据。
红色框框起来的部分,是数据存储部分,在其叶子节点中要存储具体的数据。
插入一组数据:
100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88
100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88
120 268 250
。然后观察一些数据插入过程中,节点的变化情况。
。然后观察一些数据插入过程中,节点的变化情况。
最终我们看到,
B+Tree
与
B-Tree
相比,主要有以下三点区别:
B+Tree
与
B-Tree
相比,主要有以下三点区别:
所有的数据都会出现在叶子节点。
叶子节点形成一个单向链表。
非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的
上述我们所看到的结构是标准的
B+Tree
的数据结构,接下来,我们再来看看
MySQL
中优化之后的
B+Tree
的数据结构,接下来,我们再来看看
MySQL
中优化之后的
B+Tree
。
。
MySQL
索引数据结构对经典的
B+Tree
进行了优化。在原
B+Tree
的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的
B+Tree
,提高区间访问的性能,利于排序。
索引数据结构对经典的
B+Tree
进行了优化。在原
B+Tree
的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的
B+Tree
,提高区间访问的性能,利于排序。
2.5 Hash
MySQL
中除了支持
B+Tree
索引,还支持一种索引类型
—Hash
索引。
中除了支持
B+Tree
索引,还支持一种索引类型
—Hash
索引。
1). 结构
哈希索引就是采用一定的
hash
算法,将键值换算成新的
hash
值,映射到对应的槽位上,然后存储在hash
表中。
hash
算法,将键值换算成新的
hash
值,映射到对应的槽位上,然后存储在hash
表中。
如果两个
(
或多个
)
键值,映射到一个相同的槽位上,他们就产生了
hash
冲突(也称为
hash
碰撞),可以通过链表来解决
(
或多个
)
键值,映射到一个相同的槽位上,他们就产生了
hash
冲突(也称为
hash
碰撞),可以通过链表来解决
2). 特点
A. Hash
索引只能用于对等比较
(=
,
in)
,不支持范围查询(
between
,
>
,
,
…
)
索引只能用于对等比较
(=
,
in)
,不支持范围查询(
between
,
>
,
,
…
)
B.
无法利用索引完成排序操作
无法利用索引完成排序操作
C.
查询效率高,通常
(
不存在
hash
冲突的情况
)
只需要一次检索就可以了,效率通常要高于
B+tree
索
查询效率高,通常
(
不存在
hash
冲突的情况
)
只需要一次检索就可以了,效率通常要高于
B+tree
索
引
3). 存储引擎支持
在
MySQL
中,支持
hash
索引的是
Memory
存储引擎。 而
InnoDB
中具有自适应
hash
功能,
hash
索引是InnoDB
存储引擎根据
B+Tree
索引在指定条件下自动构建的。
MySQL
中,支持
hash
索引的是
Memory
存储引擎。 而
InnoDB
中具有自适应
hash
功能,
hash
索引是InnoDB
存储引擎根据
B+Tree
索引在指定条件下自动构建的。
♥️关注,就是我创作的动力
♥️点赞,就是对我最大的认可
♥️这里是小刘,励志用心做好每一篇文章,谢谢大家