二叉樹紅黑樹和B+樹

網上看到了一些知識點,這裏作個筆記記錄一下。mysql

一、二叉排序樹的特色sql

    a、樹的左邊節點比根節點小,右邊節點比根節點大。數據庫

    b、左右子樹也都是二叉排序樹。數組

 

 

可是,在一些特殊狀況下,好比插入數據是有序的,就會發生退化狀況。性能

有序序列,二叉排序樹退化成鏈表。設計

 

二、爲了保證樹的平衡,引入了平衡樹。在插入數據的時候,同時調整這棵樹,讓它的節點儘量均勻分佈。3d

紅黑樹就是平衡樹的一種。指針

之因此要保證樹的平衡性,是由於樹的查找性能取決於樹的高度,讓樹儘量平衡,就是爲了下降樹的高度。blog

jdk內置的TreeSet底層就是用的紅黑樹。排序

 

三、B樹

B樹是一種多路搜索樹,他的每一個節點能夠擁有多餘兩個孩子節點。M路的B樹最多能擁有M個孩子節點。

這種多路的設計,能夠進一步下降樹的高度。

路數越多,樹的高度越低。若是設計成無限多路,B樹就退化成有序數組了。

B樹通常用於文件系統索引。文件系統和數據庫索引通常都存儲在硬盤上的,若是數據量大的話,不必定能一次性加載到內存中。

若是一棵樹沒法一次性加載進內存,這時候B樹的多路存儲能力就出來了,能夠每次加載B樹的一個節點,而後一步步往下找。

若是在內存中,紅黑樹比B樹效率更高,可是涉及到磁盤操做,B樹就更優了。

 

四、B+樹

B+樹是在B樹的基礎上進行改造,數據都在葉子節點上,同時葉子節點之間還加了指針造成鏈表。

B+樹通常應用在數據庫索引中,這是由應用場景決定的。

select數據不必定只選一條,不少時候會選多條。

若是多條的話,B樹須要作局部的中序遍歷,可能要跨層訪問。而B+樹全部數據都在葉子節點,不用跨層。

同時因爲有鏈表結構,只須要找到首尾,經過鏈表就能把全部數據取出。

 

問題:

B+樹的查找和插入時間複雜度跟樹的高度有關,大概是O(logN)

hash平均時間複雜度是O(1)

hash比B+樹更快,爲何mysql爲何還用B+樹來存索引呢?

這是由業務場景決定的,若是隻選一條數據,確實hash更快。可是數據庫中常常會選擇多條,這時候因爲B+樹中索引有序,

而且又有鏈表相連,它的查詢效率就比hash快不少了。

另外,數據庫中的索引通常是存儲在磁盤上,數據量大的狀況可能沒法一次裝載入內存,B+樹的設計能夠容許數據分批加載,

同時樹的高度較低,提升查詢效率。

相關文章
相關標籤/搜索