MySQL索引系列 Btree索引和hash索引

2021-10-10 08:44:37 字數 1008 閱讀 2347

hash索引是根據hash結構的定義,只需要一次運算便可以找到資料所在位置,不像b+樹或者b樹需要從根結點出發尋找資料,所以hash索引的查詢效率理論上要高於b+樹索引,但是mysql中並沒有採用這一種索引,這是由於這種索引除查詢效率之外的缺陷是十分明顯的。

hash索引的特點:

hash索引包括鍵值、hash碼和指標;對於hash索引中的所有列,儲存引擎都會為每一行計算乙個hash碼,hash索引中儲存的就是hash碼。

hash索引必須進行二次查詢使用雜湊索引兩次查詢,第一次找到相應的行,第二次讀取資料,但是被頻繁訪問到的行一般會快取在記憶體中,這點對資料庫效能的影響不大。

hash索引是基於hash表實現的,僅僅只能滿足"=","in"等精確匹配,不能使用範圍查詢。例如where price > 100。由於hash索引比較的是進行hash運算之後的hash值,所以它只能用於等值的過濾,不能用於基於範圍的過濾,因為經過相應的hash演算法處理之後的hash值的大小關係,並不能保證和hash運算前完全一樣。

無法被用來資料的排序操作,hash索引儲存的是hash碼而不是鍵值,所以無法用於外排序。

hash索引不支援部分索引查詢、也不支援範圍查詢和模糊查詢。

對於組合索引,hash索引在計算hash值的時候是組合索引鍵合併後再一起計算hash值,而不是單獨計算hash值,所以通過組合索引的前面乙個或幾個索引鍵進行查詢的時候,hash索引也無法被利用。

不能避免全表掃瞄。由於hash索引中的hash碼的計算會產生hash衝突,存在hash衝突的資料會被連線到同乙個鍊錶上。當大量資料被連線到相同鍊錶上時,查詢某條資料時,儲存引擎必須遍歷整個鍊錶中的所有行指標,逐行比較,直到找到所有的符合條件的行。此時時間複雜度並不能保證在o(1),效能也並不一定就會比b-tree索引高。所以說hash索引不適用於重複值很多的列上。

mysql索引hash索引和b tree索引的區別

mysql下增加索引的方式 修改表結構 alter mytable add index indexname on username length 建立表結構 create table mytable id int not null,username varchar 16 not null,index...

Mysql優化 B Tree索引和Hash索引

b tree和普通的b tree不大一樣。有個 可以體驗這些資料結構 先看一下b tree 設定最大深度為3,插入10個數字,資料結構如上,他與普通的二叉樹區別在於每個節點有多個資料,相當於橫向擴充套件,減少深度。為什麼要減少深度 當資料量比較大的時候,mysql無法將索引全部載入到記憶體中,只能逐...

MySQL的索引,B tree還是B tree

如果你用 show index from table 得到的index type為 btree 但是我們印象中不是應該是b 樹麼?這個鏈結裡給出了大概的解答 does mysql use b tree,b tree or both?b tree would be a very bad keyword...