hash索引和B树索引

1 hash索引

  • 哈希索引(hash index)基于哈希表(哈希码,对应数据行的指针)实现,只有精确匹配索引所在列的查询才有效(where后的查询条件是索引所在列)。
  • 对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),哈希码是一个较小的值,并且不同键值的行计算出来的哈希码也不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。
  • 对于hash相同的,采用链表的方式解决冲突。类似于hashmap。因为索引的结构是十分紧凑的,所以hash索引的查询很快。
  • 在MySQL中,只有Memory引擎显示支持哈希索引,也是默认索引类型。
举例

在这里插入图片描述

优缺点
  • 只包含哈希值和指针,而不存储字段值。
  • 存储不是执照索引值顺序的,无法用于排序。
  • 不支持部分索引列匹配,因为始终是使用索引列的全部内容来计算哈希值的。
  • 只支持等值比较查询,包括=、IN()、<>(注意<>和<=>是不同的操作)。也不支持任何范围查询,例如WHERE price>100。
  • 访问哈希索引的数据非常快,除非有很多哈希冲突。当出现哈希冲突的时候,存储引擎必须遍历链表中所有的行指针,逐行进行比较,直到找到所有符合条件的行。

2 自适应哈希

  • 在Mysql中InnoDB引擎有一个特殊的功能叫做自适应哈希索引,它会在内存中基于B-Tree索引的基础上面创建一个哈希索引,这让B-Tree索引具备了一些哈希索引的优点。
  • 在B-Tree基础上创建一个伪哈希索引。这和真正的哈希索引不是一回事,因为还是使用B-Tree进行查找,但是它使用哈希值而不是键本身进行索引查找。你需要做的就是在查询的WHERE子句中手动指定使用哈希函数。
    在这里插入图片描述
    在这里插入图片描述

3 与B树索引比较

  • Hash 索引结构检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到叶节点,需要多次IO访问。

  • Hash 索引仅仅能满足"=",“IN"和”<=>"查询(因为比较的是hash值),不能使用范围查询。

  • Hash 索引不能利用部分索引键查询。

    对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。

  • Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

    对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。

【参考文档】
聊聊Hash索引
数据库中的索引技术——哈希索引
hash索引跟B树索引的区别