B+树在面试过程中还是经常被问及的,比如:
2.除根节点外,其他的每个分支至少有(m/2)上取整 棵子树。
3.每一个节点最多m棵子树。
1.B树和B+区别?
2.B+树的定义?为什么要用b+树,而不用平衡二叉树?
等等。。。
网上关于b+树的性质,操作的帖子很多,但是我很好奇,mysql为什么使用b+树组织索引?一行行的数据文件是怎么被组织起来的?这有篇帖子我感觉真的很好,结合实际来讲解b+树。
http://blog.codinglabs.org/articles/theory-of-mysql-index.html
还有大神july:
http://blog.csdn.net/v_july_v/article/details/6530142
-------------------------------------------b树-----------------------------------------
B树(B-树)是一种多路平衡查找树,它的每个叶子节点最多包含m个孩子,m为B树的阶。
性质:
1.根结点至少有两棵子树。
2.除根节点外,其他的每个分支至少有(m/2)上取整 棵子树。
3.每一个节点最多m棵子树。
4.所有的叶子结点都位于同一层。(很多二叉树不满足此条件,因此不是b树的特例)
5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。
一颗m为5的b树
B树的高度:
此时的h是从零开始的,我们习惯将树的高度定义为h+1.
(含有n个节点的红黑树高度最多为2log(n+1)可见同样数量的节点,当B树的阶越大时树的高度越低)
B树优点:(与二叉树相比)
1.键值有序顺序存放。
2.树的高度相对较低,数据库索引使用可以减少io次数。
缺点:
1.(与B+相比)如果以B树来构建索引,它的非叶子节点是携带数据的,必然会导致缓冲到内存的索引数量会少。
2.(与红黑树相比)平衡调整很麻烦,可能得重构整课树。
----------------------------------------------b+树------------------------
b+是b树为解决文件存储的改进变性树。
不同点:
1.所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息)
2. 所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点包含节点信息也包含需要查找的信息)
b+优点:
1.非叶子节点不存储当前节点的信息,因为所有节点信息都在叶子节点上。Mysql使用b+做索引,非叶子节点只存储节点所在的路径信息而不存储具体的节点信息,这样每次可以加载更多的索引信息到内存中。
2.叶子节点存储了所有的节点信息。sql查询会经常使用到范围查询,那么当我查找到首节点时,只需要顺着当前节点指针读取就可以,这样很省时间。
缺点:b树的缺点吧。
--------------------------------------组织下语言----------------
为什么mysql索引使用b+树而不使用红黑树?
我认为b+树就是为文件存储而生的。如果数据库文件存储在主存中我认为两种结构的查询速度差距不是很大,因为主存的查找速度非常快。而数据库文件实际存储在磁盘中,定位一行信息需要查找该行文件所在柱面号,磁盘号,扇区号,页号这个阶段是很耗费时间的。每一次的定位请求意味着要做一次IO操作,也意味着成倍的时间消耗。因此减少IO查询的次数是提高查询性能的关键。而IO的查询次数就是索引树的高度,高度越低查询的次数越少。同样的结点次数红黑树的高度最多为2log(n+1),而B+树的高度最多为(logt (n+1)/2)+1,随着t增大高度会更小,IO次数也会减少。(那我t很大让树的高度只有1层-2层如何?如果数据量很大且维持在一层那么对树的查找就相当于对链表的查找O(n),通常在数据库中b+树的高度一般都在2-4,也就是说查找某一键值的行记录最多只需要2-4次IO。)
如果哪里理解有错误欢迎留言,大家一起学习。