Hash索引

提起MySQL索引,会习惯性想起B+Tree,其实MySQL常用的索引有两种:

  1. B+Tree索引
  2. Hash索引(只有Memory存储引擎支持)
    从名字上可以看到,这两种索引使用的是两种不同的数据结构,前者是B+Tree,后者是Hash。
Hash索引_第1张图片

Hash索引使用Hash算法(比如CRC32)把键值转换成一个hashcode,存放在索引中。在检索时,不必想B+树那样从根到叶子逐级查找,而是一次定位。对于每一行数据,存储引擎都会对所有索引计算一个哈希码,哈希码是一个较小的值并且不同键值计算出来的哈希码都不一样。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据的指针。

Hash索引的优缺点都很明显:

  1. Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。
  2. hash索引无法通过操作索引来排序,因为存放的时候经过hash计算,但是计算的hash值和存放的不一定相等,所以无法排序
  3. 哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询)
  4. 不能避免表扫描。Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。
  5. Hash碰撞问题会使索引效率降低

参考:MySQL索引之哈希索引,MySQL的btree索引和hash索引的区别 - 14的路 - 博客园

你可能感兴趣的:(Hash索引)