mysqlinnodb:b+树的优点
我们知道和B+树最重要的区别有以下两点:
1. B+树中只有叶⼦节点会带有指向记录的指针(ROWID),⽽B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶⼦节点中。
2. B+树中所有叶⼦节点都是通过指针连接在⼀起,⽽B树不会。
B+树的优点:
1. ⾮叶⼦节点不会带上ROWID,这样,⼀个块中可以容纳更多的索引项,⼀是可以降低树的⾼度。⼆是⼀个内部节点可以定位更多的叶⼦节点。
2. 叶⼦节点之间通过指针来连接,范围扫描将⼗分简单,⽽对于B树来说,则需要在叶⼦节点和内部节点不停的往返移动。
B树的优点:
对于在内部节点的数据,可直接得到,不必根据叶⼦节点来定位。
这就决定了B+树更适合⽤来存储外部数据,也就是所谓的磁盘数据。
从Mysql(Inoodb)的⾓度来看,B+树是⽤来充当索引的,⼀般来说索引⾮常⼤,尤其是关系性数据库这种数据量⼤的索引能达到亿级别,所以为了减少内存的占⽤,索引也会被存储在磁盘上。
那么Mysql如何衡量查询效率呢?磁盘IO次数,(B类树)的特定就是每层节点数⽬⾮常多,层数很少,⽬的就是为了就少磁盘IO次数,当查询数据的时候,最好的情况就是很快到⽬标索引,然后读取数据,使⽤B+树就能很好的完成这个⽬的,但是B-树的每个节点都有data域(指针),这⽆疑增⼤
了节点⼤⼩,说⽩了增加了磁盘IO次数(磁盘IO⼀次读出的数据量⼤⼩是固定的,单个数据变⼤,每次读出的就少,IO次数增多,⼀次IO多耗时啊!),⽽B+树除了其它节点并不存储数据,节点⼩,磁盘IO次数就少。这是优点之⼀。
另⼀个优点是什么,B+树所有的Data域在,⼀般来说都会进⾏⼀个优化,就是将所有的⽤指针串起来。这样遍历叶⼦节点就能获得全部数据,这样就能进⾏区间访问啦。
⾄于MongoDB为什么使⽤B-树⽽不是B+树,可以从它的设计⾓度来考虑,它并不是传统的关系性数据库,⽽是以Json格式作为存储的nosql,⽬的就是⾼性能,⾼可⽤,易扩展。⾸先它摆脱了,上⾯所述的优点2需求就没那么强烈了,其次Mysql由于使⽤B+树,数据都在叶节点上,每次查询都需要访问到叶节点,⽽MongoDB使⽤B-树,所有节点都有Data域,只要到指定索引就可以进⾏访问,⽆疑单次查询平均快于Mysql(但侧⾯来看Mysql⾄少平均查询耗时差不多)。
总体来说,Mysql选⽤B+树和MongoDB选⽤B-树还是以⾃⼰的需求来选择的。
为什么B+树可以满⾜要求?
1) B+-tree的磁盘读写代价更低  B+-tree的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更⼩。如果把所有同⼀内部结点的关键字存放在同⼀盘块中,那么盘块所能容纳的关键字
数量也越多。⼀次性读⼊内存中的需要查的关键字也就越多。相对来说IO读写次数也就降低了。举个例⼦,假设磁盘中的⼀个盘块容纳16bytes,⽽⼀个关键字2bytes,⼀个关键字具体信息指针2bytes。⼀棵9阶B-tree(⼀个结点最多8个关键字)的内部结点需要2个盘快。⽽B+ 树内部结点只需要1个盘快。当需要把内部结点读⼊内存中的时候,B 树就⽐B+ 树多⼀次盘块查时间(在磁盘中就是盘⽚旋转的时间)。
mysql下载哪个盘2) B+-tree的查询效率更加稳定由于⾮终结点并不是最终指向⽂件内容的结点,⽽只是叶⼦结点中关键字的索引。所以任何关键字的查必须⾛⼀条从根结点到叶⼦结点的路。所有关键字查询的路径长度相同,导致每⼀个数据的查询效率相当。
3) “B+树还有⼀个最⼤的好处,⽅便扫库,B树必须⽤中序遍历的⽅法按序扫库,⽽B+树直接从叶⼦结点挨个扫⼀遍就完了,B+树⽀持range-query⾮常⽅便,⽽B树不⽀持。这是数据库选⽤B+树的最主要原因。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。