程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

mysql索引总结(二) mysql索引的使用和原理

balukai 2024-12-24 10:48:00 文章精选 120 ℃

1、B-Tree数据结构实现索引优缺点

B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key,5个指针;

知识小贴士: 树的度数指的是一个节点的子节点个数。

https://www.cs.usfca.edu/~galles/visualization/BTree.html:这是一个数据结构可视化网站,里面可以动态演示数据结构的变化情况;

1.1、B-Tree的特点:

  • 5阶的B树,每一个节点最多存储4个key,对应5个指针。
  • 一旦节点存储的key数量到达5,就会裂变,中间元素向上分裂。
  • 在B树中,非叶子节点和叶子节点都会存放数据。

1.2、为什么不使用B-Tree作为索引的数据结构?

在B-Tree中有一个很重要的点就是,非叶子节点和叶子节点都会存放数据。而非叶子节点和叶子节点都是存放在页里面的,页的大小是固定的16k,所以如果将数据和节点放在一起,那么数据会占用大量的空间,导致每个页的节点的数量减少。每个页里面节点的数量少了就会导致整个索引的层级更多,层级多了就会增加检索的次数,检索的次数多了就会降低查询的速度,导致性能降低。所以索引没有使用B-Tree;


2、接下来就是我们索引使用的数据结构了B+Tree

B+Tree是B-Tree的变种,我们以一颗最大度数(max-degree)为4(4阶)的b+tree为例,来看一下其结构示意图:

我们可以看到,两部分:

  • 蓝色框框起来的部分,是索引部分,仅仅起到索引数据的作用,不存储数据。
  • 绿色框框起来的部分,是数据存储部分,在其叶子节点中要存储具体的数据。

2.1、B+Tree 与 B-Tree相比,主要有以下三点区别:

  • 所有的数据都会出现在叶子节点。
  • 叶子节点形成一个单向链表。
  • 非叶子节点仅仅起到索引数据作用,具体的数据都是在叶子节点存放的。

2.2、上述我们所看到的结构是标准的B+Tree的数据结构,接下来,我们再来看看MySQL中优化之后的B+Tree。

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


3、使用hash数据结构作为索引

哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。

如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hash碰撞),可以通过链表来解决。

3.1、特点

  • Hash索引只能用于对等比较(=,in),不支持范围查询(between,>,< ,...)
  • 无法利用索引完成排序操作
  • 查询效率高,通常(不存在hash冲突的情况)只需要一次检索就可以了,效率通常要高于B+tree索引;

4、下面我们通过常见的面试题,再次回顾一下索引的数据结构

4.1、为什么InnoDB存储引擎选择使用B+tree索引结构?

A. 相对于二叉树,层级更少,搜索效率高;

B. 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;

C. 相对Hash索引,B+tree支持范围匹配及排序操作;

最近发表
标签列表