出處:https://www.jianshu.com/p/86a1fd2d7406mysql
寫在前面,好像不一樣的教材對b樹,b-樹的定義不同。我就不糾結這個究竟是叫b-樹仍是b-樹了。sql
如圖所示,區別有如下兩點:數據庫
B+樹的優勢:數據結構
B樹的優勢:
對於在內部節點的數據,可直接獲得,沒必要根據葉子節點來定位。性能
B樹長什麼樣子?mysql索引
先說一下紅黑樹,紅黑樹有一個比較複雜的規則,紅的結點balala怎麼樣,黑的結點balalal怎麼樣。大一大二學這些的時候,傻呵呵的想背課文同樣背下來,當也不知道爲何要設計成這樣。換一句話說,爲何平衡樹和紅黑樹的區別是什麼?爲何有了平衡樹還要設計出來紅黑樹?spa
紅黑樹的規則:
1)每一個結點要麼是紅的,要麼是黑的。
2)根結點是黑的。
3)每一個葉結點(葉結點即指樹尾端NIL指針或NULL結點)是黑的。
4)若是一個結點是紅的,那麼它的倆個兒子都是黑的。
5)對於任一結點而言,其到葉結點樹尾端NIL指針的每一條路徑都包含相同數目的黑結點。設計
如今想一想,個人理解是平衡樹(AVL)更平衡,結構上更加直觀,時間效能針對讀取而言更高,可是維護起來比較麻煩!!!(插入和刪除以後,都須要rebalance)。可是,紅黑樹經過它規則的設定,確保了插入和刪除的最壞的時間複雜度是O(log N) 。指針
設計紅黑樹的目的,就是解決平衡樹的維護起來比較麻煩的問題,紅黑樹,讀取略遜於AVL,維護強於AVL,每次插入和刪除的平均旋轉次數應該是遠小於平衡樹。blog
小結一下:
能用平衡樹的地方,就能夠用紅黑樹。用紅黑樹以後,讀取略遜於AVL,維護強於AVL。
紅黑樹多用在內部排序,即全放在內存中的,STL的map和set的內部實現就是紅黑樹。
B+樹多用於外存上時,B+也被成爲一個磁盤友好的數據結構。
爲何b+磁盤友好?
磁盤讀寫代價更低
樹的非葉子結點裏面沒有數據,這樣索引比較小,能夠放在一個blcok(或者儘量少的blcok)裏面。避免了樹形結構不斷的向下查找,而後磁盤不停的尋道,讀數據。這樣的設計,能夠下降io的次數。
查詢效率更加穩定
非終結點並非最終指向文件內容的結點,而只是葉子結點中關鍵字的索引。因此任何關鍵字的查找必須走一條從根結點到葉子結點的路。全部關鍵字查詢的路徑長度相同,致使每個數據的查詢效率至關。
遍歷全部的數據更方便
B+樹只要遍歷葉子節點就能夠實現整棵樹的遍歷,而其餘的樹形結構 要中序遍歷才能夠訪問全部的數據。
題外話:爲何mysql索引使用b+樹而不使用紅黑樹?
b+樹就是爲文件存儲而生的。若是數據庫文件存儲在主存中我認爲兩種結構的查詢速度差距不是很大,由於主存的查找速度很是快。而數據庫文件實際存儲在磁盤中,定位一行信息須要查找該行文件所在柱面號,磁盤號,扇區號,頁號這個階段是很耗費時間的。每一次的定位請求意味着要作一次IO操做,也意味着成倍的時間消耗。所以減小IO查詢的次數是提升查詢性能的關鍵。而IO的查詢次數就是索引樹的高度,高度越低查詢的次數越少。一樣的結點次數紅黑樹的高度最多爲2log(n+1),而B+樹的高度最多爲(logt (n+1)/2)+1,隨着t增大高度會更小,IO次數也會減小。