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