Hash索引和B+樹索引總結


先說Hash索引

在理想的情況下,key非常分散,不存在Hash碰撞的話,采用Hash索引可以唯一得確定一個key的位置,並且這個位置上就只有一個key,所以查找時間復雜度是O(1),非常快,這是Hash索引的最主要優勢。但是呢,Hash索引不是沒有缺點,不存在Hash碰撞這是理想情況,通常情況下,同一個Hash值都不只有一個key,也就是說你根據一個key找到了他的hash值位置之后,但是這個位置還有別的key,所以你還得從這個位置找到真正的key,至於怎么找,這個和具體的hash碰撞處理方式有關,最常用的擴展鏈表法,就是在hash位置上放置鏈表,此時,就存在一個鏈表查詢的過程,如果hash碰撞比較嚴重,查詢的時間復雜度就遠不止O(1),那么hash索引的優勢就失去了。其次,Hash索引是不排序的,因此它只適用於等值查詢,如果你要查詢一定的范圍內的數據,那么hash索引是無能為力的,只能把數據挨個查,而不能僅僅是查詢到頭尾數據之后,從頭讀到位。並且,hash索引也無法根據索引完成排序,這也是它的不足之一。

再說B+數索引

B+樹是一顆嚴格平衡搜索的樹,從根節點到達每一個葉子節點的路徑長度都是一樣的,並且每個節點可以有多個孩子節點(高扇出),所以可以進可能的把樹的高度降到很低。這么做的好處是可以降低讀取節點的次數,這就是的B+樹非常適合做外部文件索引了。在外部文件索引中,必須要讀取到一個節點之后,才能知道它所有的孩子幾點的位置,而讀取一個節點對應一次IO,所以讀取葉子節點的IO數就等於樹的高度了,因此樹的高度越低,所需要的IO次數就越少。B+樹是一顆搜索樹,所有的數據都放在葉子節點上,並且這些數據是按順序排列的。所以在范圍查詢中,只需要找到范圍的上下界節點,就可以得到整個范圍內的數據,而且還有一個好處,由於這些數據都是排好序的,所以無需對數據進行再次排序。

總結:

1.Hash索引在不存在hash碰撞的情況下,之需一次讀取,查詢復雜度為O(1),比B+樹快。

2.但是Hash索引是無序的,所以只適用於等值查詢,而不能用於范圍查詢,自然也不具備排序性。根據hash索引查詢出來的數據,還有再次進行排序

3.B+樹索引的復雜度等於樹的高度,一般為3-5次IO。但是B+樹葉子節點上的數據是排過序的,因此可以作用於范圍查找,而且查詢的數據是排過序的,無需再次排序。對於像“SELECT xxx FROM TABLE1 WHERE xxx LIKE 'aaa%'”這樣涉及到模糊匹配的查詢,本質上也是范圍查詢。

4.還有一點,數據庫中的多列索引中,只能用B+樹索引。數據在B+樹的哪個結點上,只取決於最左邊的列上的key,在結點中在一次按照第二列、第三列排序。所以B+樹索引有最左原則的特性。

 


免責聲明!

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



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