Mysql索引结构

tech2023-05-21  97

MySql索引是一种经过排序数据结构,究竟是什么样的数据结构呢,我们来谈一下常见的几种数据结构的演变历史。

几种数据结构:

二叉查找树 特征: - 任意结点(包括根结点)的左子树上的结点的值都比这个结点得值小; - 任意结点(包括根结点)的右子树上的结点的值都比这个结点得值大;

输入一组数据:8,5,9,7,10,4  可以看到这种结构:

二叉查找树-输入无序

 树高度为3,如果我们输入一组有序的数据呢,4,5,7,8,9,10  会变成什么样子?

二叉查找树-输入有序

这个时候变成了一颗斜树,树的高度为 6,很明显问题出现来,树高太高,遍历次数多

平衡二叉树 基于二叉查找树通过左旋、右旋的方式调整树高。 特征: - 任意结点(包括根结点)的左子树上的结点的值都比这个结点得值小; - 任意结点(包括根结点)的右子树上的结点的值都比这个结点得值大; - 左右两个子树的高度差的绝对值不超过1;

我们同样输入上面有序的数据

平衡二叉树

发现他很好的解决了二叉查找树的斜树树高问题,但随着数据量的暴增,可以想象当数据量达到百万、千万甚至上亿的时候树高的问题又成为了瓶颈,因为每个节点只有两个子节点。 

B树 B树是其实就是多路平衡查找树,说白了就是对每个节点做了横向扩展了,每个节点不再单纯的只存一个数据。 每个节点存储了数据行+指向分支节点的多个引用。 根节点和每个分支节点的分支数称为度,度为N,每个分支节点可存储的数据最大个数为N-1

假设B树的度为3,则每个节点有3个分支,而每个节点可存储的数据量为2

B-tree B+树 B+tree是在B-tree的基础上,进一步横向扩展 将每个分支节点存储的数据下沉到叶子节点,而根节点和分支节点只存储索引值 每个节点节省出来的存储空间可以用来存储更多的数据项,使树的形状变得矮胖 每个节点存储的内容相比B-tree,仅保存了数据行的索引值+指向分支节点的引用 B+Tree

 


阶段性小结:

对比二叉查找树、平衡二叉树、B-Tree、B+Tree的演变过程,都是为解决树高问题,尽可能的减少遍历或者磁盘IO次数。 分享个在线可视化数据结构的小工具,可以自己调节生成节点的速率,能够清楚的看到树形结构的生成过程: https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

Mysql索引结构:

上面介绍了几种常见的数据结构之后,可以看到二叉查找树和平衡二叉树是有很大的局限性,mysql索引使用的B+Tree,我们来对比下两个的差别。

我们有一张表:a_user(id, name, mobile三个字段),id字段创建了主键索引,name字段创建了普通索引

如果是B-Tree的结构

 

如果是B+Tree

 差异 B-Tree在每个节点存储了数据行的磁盘地址 B+Tree则只存储了索引列的值,占用空间更少,单个节点可存放的数据更多 B+Tree将数据存放在叶子节点,通过索引可直接在数据结构中查到行数据

总结:

如图,聚集索引查询效率最高,二级索引会有一次回表的动作,回表就是指根据二级索引查询到数据后会根据主键再扫描一次聚集索引。

 

最新回复(0)