Mysql索引为什么使用B+树
为什么不适用二叉平衡树(AVL树,红黑树)

1.二叉平衡树每个节点有两个子节点,这意味着树的高度更高,IO次数更多
2.查询效率不稳定,如果要查询的数据在叶子节点,需要进行多次IO
3.磁盘IO是以页为单位的,一页=4k,如果使用二叉平衡树,每个节点只存储两个子节点的引用(两路),也就是一次IO操作只加载了两个自己子节点的引用,太浪费了
因此要使用多路平衡树
为什么不使用B树
B+树与B树的区别:InnoDB中索引的实现采用的是B+树。B+树是B树的变种。B+树非叶子节点不存储数据只存储索引,在相同数据量下,B+树高度更低,且B+树叶子节点之间组成一个链表,便于遍历查询
B树:

B+树

也就是如果我们要查找6这个节点,B树在第二层找到这个节点就可以直接访问到数据,B+树需要继续向下访问到叶子节点
B+树的优势在于查找效率上,下面我们做一具体说明:
首先,B+树的查找和B树一样,类似于二叉搜索树。起始于根节点,自顶向下遍历树,选择其分离值在要查找值的任意一边的子指针。在节点内部典型的使用是二分查找来确定这个位置。
(1)不同的是,B+树中间节点没有卫星数据(索引元素所指向的数据记录),只有索引,而B树每个结点中的每个关键字都有卫星数据;这就意味着同样的大小的磁盘页可以容纳更多节点元素,在相同的数据量下,B+树更加“矮胖”,IO操作更少。需要补充的是,在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。
(2)其次,因为卫星数据的不同,导致查询过程也不同;B树的查找只需找到匹配元素即可,最好情况下查找到根节点,最坏情况下查找到叶子结点,所说性能很不稳定,而B+树每次必须查找到叶子结点,性能稳定
(3)在范围查询方面,B+树的优势更加明显。B树的范围查找需要不断依赖中序遍历。首先二分查找到范围下限,在不断通过中序遍历,直到查找到范围的上限即可。整个过程比较耗时。而B+树的范围查找则简单了许多。首先通过二分查找,找到范围下限,然后同过叶子结点的链表顺序遍历,直至找到上限即可,整个过程简单许多,效率也比较高。

浙公网安备 33010602011771号