Mysql為什么使用b+樹,而不是b樹、AVL樹或紅黑樹?


  首先,我們應該考慮一個問題,數據庫在磁盤中是怎樣存儲的?(答案寫在下一篇文章中)

  b樹、b+樹、AVL樹、紅黑樹的區別很大。雖然都可以提高搜索性能,但是作用方式不同。

  通常文件和數據庫都存儲在磁盤,如果數據量大,不一定能全部加載到內存,因此使用b樹,一次只加載少量節點數據。其次,b樹是多路搜索樹,M路的B樹最多有M個子節點,通過多路搜索,降低了樹的高度,從而在避免內存溢出的情況下減少了內存與磁盤的IO次數,提升了搜索性能。

  但是使用b樹,數據存儲在每一個節點中,搜索時會做局部中序遍歷,如果查詢多條數據,即需要跨層訪問,仍然對搜索效率有不利影響,因此推出b+樹,b+樹由於所有數據存儲在葉子節點,索引存儲在非葉子節點中,因此不存在跨層訪問,同時葉子節點之間連接成鏈,搜索時只需找到首尾即可取得所需數據。因此在Innodb中使用了性能更佳的b+樹。

  AVL樹和紅黑樹卻是平衡二叉樹,但是紅黑樹並不是嚴格意義的平衡樹,AVL樹要求必須滿足所有節點左右子樹高度差不超過1,紅黑樹卻要求必須滿足沒有一條路徑比其他路徑長出兩倍。紅黑樹如何實現這一性質呢?很簡單,通過對節點顏色的控制實現,即要求

  (1)根節點必須是黑色

  (2)葉子節點(Nil)必須是黑色

  (3)紅色節點的兩個子節點必須是黑色

  (4)任意節點到每個葉子節點路徑包含相同數量的黑節點(最重要)

  紅黑樹相較於AVL樹來說,對平衡要求的寬松,大大減少了旋轉帶來的耗時問題,平衡樹旋轉是很耗時的,因此,在內存中使用紅黑樹效率高,如hashmap等。

  既然紅黑樹搜索效率也高,為什么數據庫使用b+樹,這是因為紅黑樹仍然是一棵二叉樹,相同數量的節點,紅黑樹更深,不適用與磁盤的IO。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM