MySQL中的数据结构(1):Hash结构

294 阅读2分钟

 Hash结构

概述

Hash算法是通过某种确定的算法(MD5、SHA1、SHA2、SHA3等)将输入进行算法处理后输出,相同的输入永远可以得到相同的输出,但若是输入内容有微小的偏差,输出通常会有不同的结果。

采用Hash进行的检索,基本一次就可以找到数据,从效率来说比B+树更快。

数据检索

在hash的方式下,会利用hash函数根据关键字k计算出一个hash表(T[0...n-1])的槽位置,将该关键字映射到槽上。

image.png

当遇到碰撞时(不同的关键字得到同样的槽),数据库中一般采用链接法来解决:

image.png

缺陷(为什么还需要树形结构)

 1. Hash索引只能进行 等于、不等于、IN 等查询,若是要进行范围查询,hash索引的时间复杂度会退化为O(n),而树型的索引依旧能保持O(log2N)的高效率。

  1. Hash表的数据是没有顺序的,在ORDER BY 情况下,还需要对数据重新排序

  2. 对于联合索引,Hash 无法对单独的一个键或几个键进行查询,只能将联合索引键联合后一起计算。

  3. 在等值查询时,若是索引列的重复值过多,就会多次触发Hash冲突,每次冲突都需要遍历桶排序中的指针来进行比较查找关键字,会使效率降低。

优点(适用性)

  1. MySQL中的Memory存储引擎支持Hash存储,当我们需要查询Memory表(临时表)时,可将某个字段设为Hash索引(eg:字符串类型的字段),进行hash计算后长度可以缩短到几个字节,经常需要进行等值查询且字段重复度低时,可采用hash索引。

  2. InnoDB本身不支持Hash索引,但提供自适应Hash索引innodb_adaptive_hash_index查看是否开启):当某个数据经常被访问并且满足一定条件时,系统会将这个数据页的地址存储到Hash表中,下次查询时直接找到这个页的所在位置(当B+树较深时可以明显提高效率),让B+树也具备了Hash索引的优点。