赞
踩
B+ 树: 是由二叉查找树,平衡二叉树和B树演化而来
二叉查找树: 任何节点的左节点的值都小于该节点,右节点都大于该节点。
为了避免二叉查找树的极端情况,即太高瘦,引入了平衡二叉树。
平衡二叉树: 又称 AVL 树,在满足二叉查找树特性的基础上,要求每个节点的左右子树的高度差不能超过 1。不平衡的时候会通过调整节点进行平衡,即要矮胖。
二叉查找树和平衡二叉树较为熟悉,不详细说,主要记录B树和B+树。
因为数据存储在内存容易丢失,所以我们存储数据的话都是存在磁盘这种外围设备中。
但和内存相比,从磁盘中读取数据的速度会慢上百倍千倍甚至万倍,所以我们要想办法尽量减少读磁盘的次数。
另外,从磁盘中读取数据时,都是按照磁盘块来读取的,并不是一条一条的读。
那如果我们能尽量把更多的数据存放在一个磁盘块中,那么我们读取一次磁盘就可以读取更多的数据,从而减少读取磁盘的次数。
如果我们用树这种数据结构作为索引的数据结构,那我们每查找一次数据就需要从磁盘中读取一个节点,也就是我们说的一个磁盘块。
而平衡二叉树是每个节点只存储一个键值和数据的
那说明什么?
说明每个磁盘块仅仅存储一个键值和数据!那如果我们要存储海量的数据呢?
也就会导致二叉树的节点特别多,树的高度也特别高。
最终当我们需要查找数据的时候就要进行多次的磁盘IO查找,效率极低!
故 为了解决这种缺陷,我们就设计了一种每个节点可以存储多个键值和数据的平衡树,即B树。
图中的每个节点称为页
页就是我们上面说的磁盘块,在 MySQL 中数据读取的基本单位都是页,所以我们这里叫做页更符合 MySQL 中索引的底层数据结构。
跟平衡二叉树相比,B树的每个节点存储了更多的键值(key)和数据(data),每个节点可以拥有更多的子结点,子结点的个数通常称为 阶,上图的B树即为 3阶B树。
注意:B树的节点包含了键值和数据两部分,每个数据在树中只出现一次。
B+ 树是对 B 树的进一步优化。
什么是聚集索引呢?在 MySQL 中,B+ 树索引按照存储方式的不同分为聚集索引和非聚集索引
非聚集索引与聚集索引的区别
在于非聚集索引的叶子节点不存储表中的数据,而是存储该列对应的主键
想要查找数据我们还需要根据主键再去聚集索引中进行查找,这个再根据聚集索引查找数据的过程,我们称为回表。
即查找数据顺序是:先从非聚集索引找到主键->再根据主键到聚集索引找到对应的数据
MySQL的索引结构为什么是B+树?而不是其他
可能出现高高瘦瘦“一条龙”的景象,把二叉查找树退化为一个链表,相当于全表扫描,查找元素发挥不了二叉排序树的优势,只能按照链表的形式查找,高度太高了,查找效率不稳定。
平衡二叉树解决了二叉树高度太高,查找效率不稳定的问题。但是,平衡二叉树的每个节点只存储一个键值和数据,如果数据非常的多(大多数情况下数据是海量的),二叉树的结点将会非常多,高度也会及其高,去磁盘取数据的次数就多,查找效率降低。
B树相对于平衡二叉树,优势在于每个节点存储了更多的键值(key)和数据(data),并且每个节点拥有更多的子结点,高度就会降低,B树在提高了IO性能的同时并没有解决元素遍历效率低下的问题,在找数据时需要遍历整个B树,为解决这个问题引出了B+树。
而且和B树相比,B+树的非叶子节点是值存储键值的,不存储数据,这样的话B+树的一个节点就可以存储更多的节点,使得树变得更加矮胖,从而查找效率更高。
参考文章:
https://blog.csdn.net/qq_45814695/article/details/117171536
https://blog.csdn.net/qq_42410605/article/details/122517769
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。