索引算法介紹
線性查找
線性查找就是最簡單的查找算法,在一個數組或者鏈表從頭到尾遍歷查找,時間複雜度是o(n)
二分查找
二分法相比於線性查找時間複雜度降低到了o(logn)
級別,但是添加了一些限制
- 必須是數組,支持隨機訪問
- 數組中元素必須是有序的
二叉搜索樹
二分法的缺點就是必須支持隨機訪問,但是對於數組而言如果進行插入操作的話時間複雜度是o(n)
級別;二分搜索樹就是結合了二分法和鏈表的優勢實現的,二分搜索樹有如下特點
- 二分搜索樹是滿二叉樹
- 二分搜索樹中任一節點大於左子樹的所有節點、小於右子樹的所有節點
- 搜索、插入、刪除的時間複雜度是
o(logn)
級別的
平衡搜索樹
平衡二叉樹本質上還是二分搜索樹,只不過平衡二叉樹約束了左子樹和右子樹的高度,比如紅黑樹要求任意節點左右子樹的高度差不能超過1
二分搜索樹在左右子樹極不平衡的情況下會退化成鏈表,平衡二叉樹就是爲了解決此問題的
B樹
平衡二叉樹有兩個問題:
-
平衡二叉樹一個節點只能存儲一個數據
在內存中這樣並沒有問題,但是在數據庫場景下落盤就會存在問題:硬盤讀取的最小單位是扇區,可能是512字節或者4KB;假設我們讀取一個節點,那麼從硬盤中一次讀取的數據只有很少一部分有用
-
平衡二叉樹深度較高
平衡二叉樹很容易達到幾十層,對於硬盤IO來說代價還是有點大
B樹是類似於圖中這樣的樹,它是結合了線性查找和二分搜索樹的特點而來的:
- 每一個節點可以存儲多項內容,每一項同時包含索引和數據
備註:普通的二叉樹或B樹每個節點存儲的就是整數,這個整數既是節點的數據也是節點用來索引/排序的標記;但是在真正的場景中如MySQL中,一項數據包括很多內容而索引可能只是其中一項。
B+樹
B
樹同樣存在問題,就是在範圍查找時非常困難
B+
樹和B
樹的區別在於
- 底層是一個雙向鏈表,存儲了所有的數據
- 上層只存儲索引而不存儲數據