B-tree

  看完记不住的辣鸡,只好抄一遍。

       

  Mysql数据库的索引是基于Hash表或者B+树,因为树的查询效率高,而且可以保持有序。不适用二叉查找树(查询时间复杂度O(logN))的原因是,需要考虑磁盘IO的效率,数据库索引都存储在磁盘上(大小可能有几个G),利用索引进行查询的时候,不能将整个索引全部加载到内存,能做的只有逐一加载每一个磁盘页(一个磁盘页对应索引树的节点)。

  

要了解B+树必须先了解B-树(应用:非关系型数据库MongoDB)。

   B-树是一种多路平衡查找树(优势:自平衡),每个节点最多m个孩子,m是B-树的阶,m的大小取决于磁盘页的大小(通常是4k)。

  1:根节点至少2个孩子

  2:每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

  3:每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m

  4:所有叶子结点都位于同一层

  5:每个节点中的元素都从小到大排列,系欸但当中k-1个元素正好是k个孩子包含的元素的值域划分

 

B+树的查询性能更高

  1:有k个孩子的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。

  2:所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

  3:所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。(形成了有序列表,方便进行范围查询)

  卫星数据:索引元素所指向的数据记录,B-树中全都有(查询效率不稳定),B+树中只有叶子节点有(查询效率稳定)。

  因此:同样大小的磁盘页,B+树能容纳更多的节点元素。(更矮胖,IO次数更少)

 

 reference:漫画:什么是B-树? - 小灰的文章 - 知乎 https://zhuanlan.zhihu.com/p/54084335

       漫画:什么是B+树? - 小灰的文章 - 知乎 https://zhuanlan.zhihu.com/p/54102723

posted @ 2020-11-01 10:05  小小马进阶笔记  阅读(143)  评论(0)    收藏  举报