索引3 Hash索引與BitMap索引

2021-10-02 17:34:56 字數 1588 閱讀 5769

hash索引原理:

hash索引是將索引鍵通過hash運算後,將運算結果的hash值和對應的行指標資訊儲存bucket。

引用:『』雜湊索引(hash index)基於雜湊表實現,只有精確匹配索引所有列的查詢才有效。對於每一行資料,儲存引擎都會對所有的索引列計算乙個雜湊碼(hash code),雜湊碼是乙個較小的值,並且不同鍵值的行計算出來的雜湊碼也不一樣。雜湊索引將所有的雜湊碼儲存在索引中,同時在雜湊表中儲存指向每個資料行的指標。對於hash相同的,採用鍊錶的方式解決衝突。類似於hashmap。因為索引的結構是十分緊湊的,所以hash索引的查詢很快『』

keys------->buckets--------->entries載入進入記憶體

相比與b+樹,hash索引可以直接key值查詢出相應的buckets資訊(進行雜湊演算法計算,得到雜湊值,排序在雜湊陣列上。所以hash索引可以一次定位,其效率很高),不用像b+樹從根節點遍歷到葉節點,減少了很多磁碟i/o.

hash索引的缺陷:

1.僅滿足『=』和『in』,不可以做範圍查詢(雜湊索引只支援等值比較查詢,包括=、in()、<>(注意<>和<=>是不同的操作)。也不支援任何範圍查詢,例如where price>100。)

hash索引因為底層是雜湊表,資料儲存在雜湊表中順序是沒有關聯的,所以他不適合範圍查詢,如果要範圍查詢就需要全表掃瞄,他只適合全值掃瞄

因為索引值需要進行hash運算將值和行指標資訊->bucket,所以查詢還是相當於從bucket查詢。

2.雜湊索引資料並不是按照索引值順序儲存的,所以也就無法用於排序。

由於hash索引中存放的是經過 hash 計算之後的 hash 值,而且hash值的大小關係並不一定和 hash 運算前的鍵值完全一樣,所以資料庫無法利用索引的資料來避免任何排序運算;

3.雜湊索引也不支援部分索引列匹配查詢,因為雜湊索引始終是使用索引列的全部內容來計算雜湊值的。

4.雜湊索引只包含雜湊值和行指標,而不儲存字段值,所以不能使用索引中的值來避免讀取行。

5.

當雜湊值大量重複且資料量非常大時,其檢索效率並沒有btree索引高的。訪問雜湊索引的資料非常快,除非有很多雜湊衝突(不同的索引列值卻有相同的雜湊值)。當出現雜湊衝突的時候,儲存引擎必須遍歷鍊錶中所有的行指標,逐行進行比較,直到找到所有符合條件的行。

如果雜湊衝突很多的話,一些索引維護操作的代價也會很高。例如,如果在某個選擇性很低(雜湊衝突很多)的列上建立雜湊索引,那麼當從表中刪除一行時,儲存引擎需要遍歷對應雜湊值的鍊錶中的每一行,找到並刪除對應行的引用,衝突越多,代價越大

6.hash索引在任何時候都不能避免表掃瞄

hash 索引是將索引鍵通過 hash 運算之後,將 hash運算結果的 hash 值和所對應的行指標資訊存放於乙個 hash 表中,由於不同索引鍵存在相同 hash 值,所以即使取滿足某個 hash 鍵值的資料的記錄條數,也無法從 hash 索引中直接完成查詢,還是要通過訪問表中的實際資料進行相應的比較,並得到相應的結果。

mysql B tree索引與hash索引

一.mysql支援的索引型別 mysql的索引是在儲存引擎層實現的,即使同一種索引在不同的儲存引擎上也可能底層實現不同。1.1 b tree索引是我們最常見的索引。1 特點 使用b 樹結構儲存資料。b 樹結構特點 每乙個節點都儲存下乙個節點的指標。這樣可以方便葉子節點的遍歷。每乙個葉子節點到根節點的...

Mysql BTREE 索引與HASH 索引

btree 索引與hash 索引,兩種不同型別的索引各有其不同的適用範圍。hash 索引有一些重要的特徵需要在使用的時候特別注意,如下所示 1.只用於使用 或 操作符的等式比較。2.優化器不能使用hash 索引來加速order by 操作。3.其mysql 不能確定在兩個值之間大約有多少行。如果將乙...

Btree索引,Hash索引

1.什麼是btree索引,hash索引 備註 在mysql 文件裡,實際上是把 b 樹索引寫成了 btree 在 mysql 裡常用的索引資料結構有 b 樹索引 和雜湊索引 兩種。2.btree索引,hash索引特點 b 樹索引是乙個平衡的多叉樹,同層級的節點間有指標相互鏈結,基於索引的順序掃瞄時,...