哈希索引基於哈希表實現,只有精確匹配索引全部列的查詢纔有效。mysql
在MySQL中只有Memory引擎顯示支持哈希索引,也是memory引擎表的默認索引類型。memory引擎是支持非惟一哈希索引的。若是多個列的哈希值相同,索引會以鏈表 的方式存放多個記錄指針道同一個哈希條目中。sql
舉個粒子:數據庫
create table testhash( fname varchar(50) not null, lname varchar(50) not null, key using hash(fname) )engine=memory; 數據庫中的數據: mysql> select * from testhash; +--------+-----------+ | fname | lname | +--------+-----------+ | Baron | Schwartz | | Arjen | Lentz | | Peter | Zaitsev | | Vadim | Tkachenko | +--------+-----------+ 4 rows in set (0.00 sec)
假設f() 爲哈希函數,f(fname) 的返回值是其哈希值,對應槽位。槽位是按順序排列的。每一個槽位上的值指向數據。
(結構能夠理解爲 jdk 1.7 中的hashmap的數據結構,一個數組和鏈表的形式)
數組
ERROR 1054 (42S22): Unknown column 'lane' in 'field list' mysql> select lname from testhash where fname ='Peter'; +---------+ | lname | +---------+ | Zaitsev | +---------+ 1 row in set (0.00 sec)
查找的過程是是先計算'Peter'的哈希值,並使用改值尋找對應的記錄指針,也就是計算f('Peter'),獲得其哈希值爲 3468 ,而後在對應的槽位上找到記錄指針,找到對應行上的數據,最後一步是比較查找的值是否爲'Peter' ,以確保就是要查找的行。數據結構
哈希索引的限制函數
=、IN() 、<=>
,也不支持任何範圍查找,例如 where price > 100.InnoDB引擎有一個特殊的功能叫作"自適應哈希索引。當InnoDB注意到某些索引值被引用得很是頻繁時,他會在內存中基於B-Tree索引智商在建立一個哈希索引,這樣就讓B-Tree索引也具備哈希索引的一些優勢。這是一個徹底自動 的、內部的行爲,用戶沒法控制或配置。不過若是有必要,徹底能夠關閉該功能。spa