Mysql 索引底层结构探索

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Nicolas12/article/details/81159618

索引用于提高数据库表的数据访问速度的一种数据结构,Binary Search Trees、Red-Black Trees、B Trees、B+ Trees,这些都可以用来做索引,为什么mysql偏偏选择B+ Trees呢?下面我们就来分析一下原因

衡量一个索引是否高效:IO渐进复杂度

Binary Search Trees (二叉搜索树)是一个线性结构,随着数据的增加,树的高度越来越高,后面的查找越来越深,还没有每个节点只能存储一个数据
这里写图片描述

Red-Black Trees (红黑树)比二叉搜索树 稍微好一点,存在的问题一样,树的高度越来越高,后面的查找越来越深,还没有每个节点只能存储一个数据
这里写图片描述

B Trees 可以有效的控制树的高度,减少访问的次数,每个内部节点存储键和数据
这里写图片描述

B+ Trees 的每个内部节点只存储键,叶子节点存储数据
这里写图片描述

到这里有人就会有疑问了,为啥说B+Tree就可以控制树的高度呢(B-Tree 也可以,后面再说它们的区别),因为每个节点可以横向扩张,当足够大时,高度就可以限制一定范围。

B+ Trees与B Trees一个很大的不同就是B+ Trees的内部节点是不存储数据,存储只是键值,在相同空间下,一个内部节点可以存储到更多的子节点。也就是说可以让整棵树更低
曾经很疑惑 B+ Trees 这么多优点为什么还会有二叉树以及B树或者红黑树的存在呢?

重点在于:B+ Trees 不能在内部节点中存储数据,这就意味着访问所有数据都需要向下访问到叶子节点才能获取到数据。虽然这会带来比较平均的访问性能,但是不能针对某项数据进行优化
例如上个图中,访问数字 1 和 6 开销是一样的,即使你访问了数字 1 1000次,而访问数字 6 只有一次,但是B Trees 和 二叉树就没有这个问题,内部节点可以关联卫星数据。

猜你喜欢

转载自blog.csdn.net/Nicolas12/article/details/81159618