B+树索引

参考博客:http://www.admin10000.com/document/5372.html

B+树索引的构造类似于二叉树,根据键值快速找到数据,B+树中的B代表平衡(balance),B+树索引并不能找到一个给定键值的具体行,B+树索引只能找到被查找数据行所在的页,数据库把页读入到内存中,最后在内存中查找到相应的数据。

B树和B+树

详见:https://blog.csdn.net/peterchan88/article/details/52248714

二叉排序树(binary sort tree):也称二叉搜索树、二叉查找树。对二叉排序树上的任意节点(有孩子节点),其左孩子节点的值小于节点的值,右孩子节点的值大于节点的值。

平衡二叉树:是一种二叉查找树,又称AVL树。其每一个节点的左子树的高度与右子树的高度差不大于1。

B树

B—tree、B-树都是指B树。B树是一种多路平衡查找树,节点最大的孩子数目称为B树的阶。

B+树索引_第1张图片

B+树

是应文件系统所需而产生的一种B-tree的变形树

 

一棵m阶的B+树和m阶的B树的异同点在于:

1.有n棵子树的结点中含有n-1个关键字;

2.所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。(而B树的叶子节点并没有包括全部需要查找的信息)

3.所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。(而B树的非终节点也包含需要查找的有效信息)

B+树索引_第2张图片

为什么说B+-tree比B树更适合实际应用中操作系统的文件索引和数据库索引

 

观点1:

1)B+-tree的磁盘读写代价更低

B+-tree的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。

举个例子,假设磁盘中的一个盘块容纳16bytes,而一个关键字2bytes,一个关键字具体信息指针2bytes。一棵9阶B-tree(一个结点最多8个关键字)的内部结点需要2个盘快。而B+树内部结点只需要1个盘快。当需要把内部结点读入内存中的时候,B 树就比B+树多一次盘块查找时间(在磁盘中就是盘片旋转的时间)。

2)B+-tree的查询效率更加稳定

由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

观点2:

数据库索引采用B+树的主要原因是 B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。正是为了解决这个问题,B+树应运而生。B+树只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作(或者说效率太低),B+树结构特别适合带有范围的查找。

 

B*树

是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针

B+树索引_第3张图片

在B+树基础上,为非叶子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3

总结

大致将B树,B+树,B*树总结如下:

B树:有序数组+平衡多叉树;

B+树:有序数组链表+平衡多叉树;

B*树:一棵丰满的B+树。

你可能感兴趣的:(mysql)