Last Updated on

前言

前面我们学习了Mysql的B+Tree索引以及使用,而实际上,在Mysql中,还有一种索引类型:Hash索引。

下面就来了解一下这个Hash索引,以及其强大和局限的地方。

正文

原理

Mysql中,Hash索引基于哈希表实现。对于每一行数据,存储引擎都会对索引列的完整值计算一个哈希码(hashcode),哈希码是一个较小的值,不同键值的行计算出的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时保存指向每个数据行的指针。

但不同key的hashcode也可以相同,所以,如果多个列的哈希值相同,就会出现Hash冲突,索引会以链表的方式存放多个记录指针到同一个哈希条目中去。

但Mysql中,支持Hash索引的只有MemoryNDB两个存储引擎。InnodbMyisam都只支持B+树索引。由于平时最常用的是Innodb存储引擎,所以Hash索引并不太常用。

使用

由于上述的原理,可以看到Hash索引是根据列的完整值作为键值进行计算得到hashcode来进行索引的。所以其存在如下一些优劣:

优势

  • 性能快: 因为根据hashcode可以直接找到对应数据
  • 索引维护代价小(小数据量下): 对索引数据的修改只需要对索引表进行对应的增删就行,不想B+树一样为了维持数的平衡稳定要进行一系列操作。

劣势

  • 只能进行等值比较查询,包括=、IN、<=> :因为hashcode是通过索引列的完整值计算出的
  • 不支持模糊查询:同上原因导致也不支持模糊查询
  • 不支持范围查询:同上原因导致也不支持范围查询
  • 不支持用于排序:因为索引数据并不是按照索引值顺序存储的,所以无法用于排序
  • Hash冲突(大数据量下):因为Hash冲突,查找的时候同时需要检查key值是否相同;如果冲突比较多的情况,会影响查询的效率,且增大索引维护操作的代价

结束

Hash索引,由于其实现原理,存在很多局限,但是由于其性能的高效,在特性情况下,如果适用Hash索引,则会带大显著的性能提升。

有任何问题,欢迎留言交流