Hash索引(MySQL)

91 阅读1分钟

概念

基于哈希算法(散列算法,Hash翻译为散列)实现,平均时间复杂度O(1)。数据的值(预映射)输入哈希函数输出某个固定长度的哈希值作为存储地址(这个过程叫压缩映射)。

问题

哈希碰撞(哈希冲突)

因为压缩的存在,不同的输入值有可能生成成相同的输出,导致不同的数据值使用同一个地址进行存储,导致存储数据不唯一。例如,哈希算法中的取余法,就可能会出现余数相同的情况。

解决方案

在MYSQL中使用链表法解决。链表法就是在出现冲突的地址使用链表存储那些计算出相同哈希值的数据。

特点

  • 适合等值查询
  • 不适用于范围查询(范围查询下哈希索引只能把数据一个一个查询出来,然后判断,时间复杂度将降为O(n))
  • 不适用于排序,因为数据存储是无序的
  • 不适合存储大量相同值的数据,例如说存储性别的数据,全是相同的值无法区分,计算出来大量相同哈希值用作地址,导致几个地址的链表上存储大量数据,时间复杂度将降为O(n)
  • 不适用于联合索引,因为是多个字段合并计算出来的哈希值作为地址,所以无法使用哈希索引查找单个字段的数据