Last Updated on
前言
前面我们学习了Mysql的B+Tree索引以及使用,而实际上,在Mysql中,还有一种索引类型:Hash索引。
下面就来了解一下这个Hash索引,以及其强大和局限的地方。
正文
原理
Mysql中,Hash索引基于哈希表
实现。对于每一行数据,存储引擎都会对索引列的完整值计算一个哈希码(hashcode)
,哈希码是一个较小的值,不同键值的行计算出的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时保存指向每个数据行的指针。
但不同key的hashcode也可以相同,所以,如果多个列的哈希值相同,就会出现Hash冲突
,索引会以链表的方式存放多个记录指针到同一个哈希条目中去。
但Mysql中,支持Hash索引的只有
Memory
和NDB
两个存储引擎。Innodb
和Myisam
都只支持B+树索引。由于平时最常用的是Innodb存储引擎,所以Hash索引并不太常用。
使用
由于上述的原理,可以看到Hash索引是根据列的完整值作为键值进行计算得到hashcode来进行索引的。所以其存在如下一些优劣:
优势
- 性能快: 因为根据hashcode可以直接找到对应数据
- 索引维护代价小(小数据量下): 对索引数据的修改只需要对索引表进行对应的增删就行,不想B+树一样为了维持数的平衡稳定要进行一系列操作。
劣势
- 只能进行等值比较查询,包括=、IN、<=> :因为hashcode是通过索引列的完整值计算出的
- 不支持模糊查询:同上原因导致也不支持模糊查询
- 不支持范围查询:同上原因导致也不支持范围查询
- 不支持用于排序:因为索引数据并不是按照索引值顺序存储的,所以无法用于排序
- Hash冲突(大数据量下):因为Hash冲突,查找的时候同时需要检查key值是否相同;如果冲突比较多的情况,会影响查询的效率,且增大索引维护操作的代价
结束
Hash索引,由于其实现原理,存在很多局限,但是由于其性能的高效,在特性情况下,如果适用Hash索引
,则会带大显著的性能提升。
有任何问题,欢迎留言交流