哈希索引(hash index)基於哈希表實現,只有精確匹配索引所有列的查詢才有效,對於每一行數據,存儲引擎都會對所有的索引列計算一個哈希碼,哈希碼是一個較小的值,並且不同鍵值的行計算出來的哈希碼也不一樣。哈希碼索引將所有的哈希碼存儲在索引中,同時在哈希表中保存指向每個數據行的指針。
因為索引自身只需存儲對應的哈希值,所以索引的結構十分緊湊,這也讓哈希索引查找的速度非常快。然而,哈希索引也有他的限制:
- 哈希索引只包含哈希值和行指針,而不存儲字段值,所以不能使用索引中的值來避免讀取行,不過,訪問內存中的行的速度很快,所以大部分情況下這一點對性能的影響並不明顯。
- 哈希索引數據並不是按照索引值順序存儲的,所以也就無法用於排序
- 哈希索引也不支持部分索引列匹配查找,因為哈希索引始終是使用索引列的全部內容來計算哈希值的。
- 哈希索引只支持等值比較查詢,包括=、IN()、<=>、也不支持任何范圍查詢。
- 訪問哈希索引的數據非常快,除非有很多哈希沖突(不同的索引列值卻有相同的哈希值)。當出現哈希沖突的時候,存儲引擎必須遍歷鏈表中所有的行指針,逐行進行比較,直到找到所有符合條件的行。
- 如果哈希沖突很多的話,一些索引維護操作的代價也會很高。例如,如果在某個選擇性很低(哈希沖突很多)的列上建立哈希索引,那么當從表中刪除一行時,存儲引擎需要遍歷對應哈希值的鏈表中的每一行,找到並刪除對應的引用,沖突越多,代價越大。
因為這些限制,哈希索引只適用於某些特定的場合。而一旦適合哈希索引,則它帶來的性能提升將非常顯著。舉個例子,在數據倉庫應用中有一種經典的“星型” schema,需要關聯很多查找表,哈希索引就非常適合查找表的需求。
除了Memory引擎外,NDB集群引擎也支持唯一哈希索引,且在NDB集群引擎中作用非常特殊。
InnoDB 引擎有一個特殊額功能叫做“自適應哈希索引”,當 InnoDB注意到某些索引值被使用得非常頻繁時,它會在內存中基於B-Tree索引之上再創建一個哈希索引,這樣就讓B-Tree索引頁具有哈希索引的一些優點,比如快速的哈希查找。這是一個完全自動的、內部的行為,用戶無法控制或者配置,不過若果有必要,完全可以關閉該功能。