常用的資料索引資料結構
在建立索引時,通常採用的資料結構有:Hash、二叉搜尋樹、紅黑樹、B樹以及B+樹。這裡主要介紹這些資料結構的設計思想,不做底層實現研究。
-
Hash結構:通過一定的演算法計算資料的Hash值,然後得到資料的存放位置,例如JAVA中的HashMap採用就是這種資料索引結構。
- 優點:檢索時間快,平均檢索時間為O(1)。
- 缺點:
- 因為Hash值是通過演算法計算出來的,存在Hash碰撞的機率,比如HashMap對於Hash值相同的資料,會在Hash值所在桶建立一個連結串列,用於存放相同Hash值的資料。
- 在資料量很大的情況下,記憶體無法載入全部的資料索引。
-
二叉搜尋樹:定義規則為“左邊節點值比根節點小,右邊節點值比根節點大,並且左右子節點都是排序樹”。
- 優點:可以解決大量資料索引無法一次載入進記憶體中的問題,二叉搜尋樹可以批量載入資料進記憶體。
- 缺點:
- 檢索時間與樹的高度有關,樹的高度越高,檢索次數及時間相對就會越久。
- 極端情況下,如果資料本身就是有序的,二叉搜尋樹會退化成連結串列,效能會急劇降低。
-
紅黑樹:紅黑樹是一種自平衡二叉樹,主要解決二叉搜尋樹在極端情況下退化成連結串列的情況,在資料插入的時候同時調整整個樹,使其節點儘量均勻分佈,保證平衡性,目的在於降低樹的高度,提高查詢效率。
- 優點:解決二叉搜尋樹的極端情況的退化問題。
-
缺點:檢索時間依舊與樹的高度有關,當資料量很大時,樹的高度就會很高,檢索的次數就會比較多,檢索的時間會比較久,效率低。
image
(圖片採自51CTO公眾號)
-
B樹:B樹是一種多路搜尋樹,每個子節點可以擁有多於2個子節點,M路的B樹最多可擁有M個子節點。設計成多路,其目的是為了降低樹的高度,降低查詢次數,提高查詢效率。
- 雖然多路可以降低樹的高度,但是如果設計成無限多路,就會退化成有序陣列,一般B樹的使用場景是用於檔案的索引,這些索引會存放於硬碟中,有時記憶體是無法一次性載入完,此時就無法進行查詢。
-
如果全部在記憶體中,紅黑樹的查詢效率要高於B樹,但是涉及到磁碟操作,B樹要優於紅黑樹,所以在JDK1.8版本的HashMap中,如果單個桶的連結串列長度多於8或全部桶的連結串列總長度多餘64,會將連結串列轉換成紅黑樹。
Image
(圖片採自51CTO公眾號)
-
B+樹:B+樹是對於B樹進行優化的多路搜尋樹,主要設計是將資料全部存放於葉子節點,並將葉子節點用指標進行連結串列連結。
- 主要使用場景:常用於資料庫的索引。
- 資料庫的索引一般資料量不小,同時又存放於磁碟中,採用多路搜尋樹,可以降低樹的高度,同時在大資料量下可以分批載入記憶體,提高查詢效率。
- 不同於B樹的使用場景,資料庫的查詢中,我們一般查詢的數量不會是單條資料,例如列表常用查詢中的分頁查詢--查詢第1頁的10條資料,此時如果採用B樹,需要進行樹的中序遍歷,可能需要跨層訪問。
-
而B+樹的所有資料全部存放於葉子節點上,且葉子節點之間採用指標進行連結串列連結,一次查詢多條時,確定首尾位置,便可以方便的確定多條資料位置。
Image
(圖片採自51CTO公眾號)
- 主要使用場景:常用於資料庫的索引。