Mysql索引结构为什么选择树型而不是Hash结构

72 阅读1分钟

从效率上来说Hash检索比B+树速度更快。采用hash进行检索基本上一次就可以找到数据,而B+树需要自顶向下依次查找,多次访问节点才能找到数据,中间需要多次I/O操作。尽管这样,但是仍旧使用树型结构有以下原因。

  1. hash索引(无序)仅能满足(=)、(<>)和IN这种等值查找。如果进行范围查找,hash索引,时间复杂度会退化到O(n),然而树型结构因为有序性的特点,依然能保持O(log_2N)的时间复杂度。
  2. hash索引数据存储是无序的,在order by的情况下,使用hash索引还需要对数据进行重新排序。
  3. 对于联合索引的情况,hash值是将联合索引键合并后一起计算,无法对单独的一个索引键或者几个索引键进行查询。比如在c1和c2列设置联合索引键,假设一种情况下c1取值4,c2取值a,另一种情况下c1取值3,c2取值b,它们的合并后的hash值有可能相同,无法判断获取的值是预期结果(此处为假设从宏观上举例,与真实计算结果有偏差)。
  4. 对于等值查询而言,通常hash索引的效率更高,但当索引的重复值如果很多时,效率就会降低。这是因为遇到hash冲突时,需要遍历桶中的行指针来进行比较,找到查询关键字,非常耗时,所以hash索引通常不会用到重复值多的列上,比如列为性别、年龄的情况等。

InnoDB本身不支持hash索引,但是提供自适应hash索引。如果某个数据经常被访问,当满足一定条件时,就会将这个数据页的地址放到hash表中。下次查询的时候,就可以直接找到这个页面的所在位置。b+树也具备了hash索引的优点。

QQ截图20220609111707.png