hash索引基于哈希表實(shí)現(xiàn)漠烧,只有精確匹配索引所有列的查詢才有效。Memory引擎默認(rèn)使用的是此種索引。
存儲(chǔ)引擎對(duì)所有的索隱列計(jì)算出一個(gè)哈希碼,將哈希碼存儲(chǔ)在索引中懂牧,同時(shí)哈希表中保存每個(gè)數(shù)據(jù)行的指針。這樣尊勿,對(duì)于此種索引查找速度是非成铮快的畜侦。出現(xiàn)哈希值碰撞的話,索引會(huì)以鏈表的形式存放多個(gè)記錄指針到同一個(gè)哈希條目中拼弃。
舉個(gè)??:
name | age |
---|---|
Jane | 28 |
Peter | 20 |
David | 30 |
假設(shè)使用假想的哈希函數(shù)f()夏伊,生成對(duì)應(yīng)的設(shè)想值:
f('Jane') = 2323
f('Peter') = 2456
f('David') = 2400
則哈希索引的數(shù)據(jù)結(jié)構(gòu)如下:
槽(slot) | 值(value) |
---|---|
2323 | 指向第1行指針 |
2400 | 指向第3行指針 |
2456 | 指向第2行指針 |
對(duì)于select * from user where `name` = 'Jane'
那么直接先算Jane
的哈希值,然后根據(jù)Jane
的hash值2323去找到對(duì)應(yīng)的第一行數(shù)據(jù)吻氧,查詢速度相對(duì)于B-Tree索引是要快溺忧,但是也有一些局限:
- hash索引中只有hash值和行數(shù)的指針,因此無(wú)法直接使用索引來(lái)避免讀取行盯孙,但是因?yàn)檫@種索引讀取快鲁森,性能影響不明顯。
- hash索引不是按照索引值順序存儲(chǔ)振惰,無(wú)法使用于排序歌溉。
- 不支持部分列匹配查找,這里面是使用索引列的全部?jī)?nèi)容來(lái)計(jì)算哈希值骑晶,例如(A,B)兩列一起建索引痛垛,單純使用A一列,那么就無(wú)法使用索引桶蛔,B-Tree索引的話匙头,因?yàn)橹С制ヅ渥钭笄熬Y,所以這種情況適用性偏好仔雷。
- 哈希索引只支持等值查詢蹂析,包括=、in()碟婆、<=>电抚,不支持where age > 10 這種范圍查詢。
- 哈希沖突很多的話竖共,維護(hù)索引操作的代價(jià)也很高