雜湊索引和B 樹索引

2021-10-02 00:17:01 字數 1178 閱讀 2338

在理想的情況下,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+樹非常適合做外部檔案索引了。在外部檔案索引中,必須要讀取到乙個節點之後,才能知道它所有的孩子幾點的位置,而讀取乙個節點對應一次io,所以讀取葉子節點的io數就等於樹的高度了,因此樹的高度越低,所需要的io次數就越少。b+樹是一顆搜尋樹,所有的資料都放在葉子節點上,並且這些資料是按順序排列的。所以在範圍查詢中,只需要找到範圍的上下界節點,就可以得到整個範圍內的資料,而且還有乙個好處,由於這些資料都是排好序的,所以無需對資料進行再次排序。

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

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

3.b+樹索引的複雜度等於樹的高度,一般為3-5次io。但是b+樹葉子節點上的資料是排過序的,因此可以作用於範圍查詢,而且查詢的資料是排過序的,無需再次排序。對於像「select *** from table1 where *** like 'aaa%'」這樣涉及到模糊匹配的查詢,本質上也是範圍查詢。

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

B 樹索引和雜湊索引的區別

在mysql裡常用的索引資料結構有b 樹索引和雜湊索引兩種,我們來看下這兩種索引資料結構的區別及其不同的應用建議。備註 先說下,在mysql文件裡,實際上是把b 樹索引寫成了btree,例如像下面這樣的寫法 create table t aid int unsigned not null auto ...

資料庫索引(B樹,B 樹,雜湊)

一.什麼是索引?索引的目的就是便於快速查詢。一本書的索引就是目錄,可以讓我們快速定位到要查詢的內容 資料庫的資料是以記錄的方式存在的,所以索引的目的就是便於查詢某一些記錄。索引型別 常見的資料庫書籍中的關於索引類別的一些稱呼 唯一索引 不允許其中任何兩行具有相同值的索引 使用主鍵和候選鍵建立的索引就...

資料庫索引(B樹,B 樹,雜湊)

資料庫索引是儲存引擎用於快速找到記錄的一種資料結構。高效能mysql 一.什麼是索引?索引的目的就是便於快速查詢。一本書的索引就是目錄,可以讓我們快速定位到要查詢的內容 資料庫的資料是以記錄的方式存在的,所以索引的目的就是便於查詢某一些記錄。索引型別 常見的資料庫書籍中的關於索引類別的一些稱呼 唯一...