索引的选择从AVL树平衡二叉树到B+树
Posted 技术无产者
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了索引的选择从AVL树平衡二叉树到B+树相关的知识,希望对你有一定的参考价值。
前置知识:
1>索引是存在于索引文件中,是一种数据结构,存在于磁盘中的。因为索引通常是很大的,因此无法一次将全部索引加载到内存当中,因此每次只能从磁盘中读取一个磁盘页的数据到内存中。而这个磁盘的读取的速度较内存中的读取速度而言是差了好几个级别。
2>传统用来搜索的平衡二叉树有很多,如 AVL 树,红黑树等。这些树在一般情况下查询性能非常好,但当数据非常大的时候它们就无能为力了。原因当数据量非常大时,内存不够用,大部分数据只能存放在磁盘上,只有需要的数据才加载到内存中。一般而言内存访问的时间约为 50 ns,而磁盘在 10 ms 左右。速度相差了近 5 个数量级,磁盘读取时间远远超过了数据在内存中比较的时间。这说明程序大部分时间会阻塞在磁盘 IO 上。那么我们如何提高程序性能?减少磁盘 IO 次数,像 AVL 树,红黑树这类平衡二叉树从设计上无法“迎合”磁盘。
二叉搜索树 AVL:
二叉树相比于顺序查找的确减少了查找次数,但是在最坏情况下,二叉树有可能退化为顺序查找。而且就二叉树本身来说,当 数据库 的数据量特别大时,其层数也将特别大。
平衡二叉树:
为了解决上面二叉树查找效率低的问题,考虑使用平衡二叉树
1>平衡二叉树的高度相对较大为 log n(底数为2)树很深,查找速度log n(底数为2),速度慢
2>平衡二叉树每个节点和自己的左右孩子节点虽然在逻辑上有父子关系,但在物理存储上可能相差很远,不在一个磁盘块上。也就是说在逻辑结构上相近的节点在物理结构上可能会差很远。因此,每次读取的磁盘页的数据中有许多是用不上的。因此,查找过程中要进行许多次的磁盘读取操作。而一个节点也就是一个对象的内存在物理上存储是连续的。
3>平衡二叉树是通过旋转来保持平衡的,而旋转是对整棵树的操作,效率很低
B树:
综合上面平衡二叉树的缺点,这里考虑使用B树,来解决上面的问题
B树的查找操作的时间复杂度为O(mlogmn)。 以m为底
1>B树相对于平衡二叉树的不同是,每个节点包含的关键字增多了,特别是在B树应用到数据库中的时候,数据库充分利用了磁盘块的原理(磁盘数据存储是采用块的形式存储的,每个块的大小为4K,每次IO进行数据读取时,同一个磁盘块的数据可以一次性读取出来)把节点大小限制和充分使用在磁盘快大小范围;
2>把树的节点关键字增多后树的层级比原来的二叉树少了,减少数据查找的次数和复杂度;
B+树
B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。为什么说B+树查找的效率要比B树更高、更稳定
当树的结点数目过多时,为了减少查询时间而引入了多路的平衡树,即B树;B+树是对B数的一种优化,改进的地方有两点,
1. 所有查询都要查找到叶子节点,查询性能稳定。
B树查询到哪个节点不确定
2.单一节点存储更多的元素,使得查询的IO次数更少。
更改了内部结点的数据存储方式, 不让其直接存储data, 这样在同样大小的存储空间下其对应的索引key会更多,查询起来速度会更快
3.所有叶子节点形成有序链表,便于范围查询
在叶子结点之间增加了链接, 将原本多个孤立的单独区间给串联起来了,可以利用磁盘预读一页后面的额外连续几页数据,这样将减少磁盘读取的次数。空间局部性原理: 如果某个位置的信息被访问,那和它相邻的信息也很有可能被访问到
B+树可以很好的利用局部性原理,若我们访问节点 key为 50,则 key 为 55、60、62 的节点将来也可能被访问,我们可以利用磁盘预读原理提前将这些数据读入内存,减少了磁盘 IO 的次数。当然B+树也能够很好的完成范围查询。比如查询 key 值在 50-70 之间的节点
B树相对于B+树的优点:
1.如果经常访问的数据离根节点很近,而B树的非叶子节点本身存有关键字其数据的地址,所以这种数据检索的时候会要比B+树快。
2.关于B树和B+树用到的实际存储空间, 反而B+树使用的空间反而要大,这是因为B树的key和data是成对出现的,有多少key就有多少对应的data需要存储,而在B+树中叶子结点负责了存储所有需要存储的key和data, 而内部结点还要额外存储用于二分检索目的的key。
参考自:
平衡二叉树、B树、B+树、B*树 理解其中一种你就都明白了 - 知乎
一文彻底搞懂MySQL基础:B树和B+树的区别_码农富哥-CSDN博客_mysqlbtree 与b+tree区别
B+树遍历与查找_XiaoGong1688的博客-CSDN博客_b+树查找
以上是关于索引的选择从AVL树平衡二叉树到B+树的主要内容,如果未能解决你的问题,请参考以下文章
数据结构~基础2~树《二叉树二叉搜索树AVL树B树红黑树》的设计~高度平衡二叉树AVL树