目录
哈希索引
哈希索引的特点
哈希索引的性能
InnoDB中的自适应哈希索引
InnoDB自适应哈希索引开关
在InnoDB存储引擎中一般使用的是B+树索引。其实mysql中还有另一种常见的索引即哈希索引;在Memory存储引擎中就支持哈希索引,同时在InnoDB存储引擎中也支持自适应哈希索引,可以与B+树索引共同使用
哈希索引
数据库中哈希索引是基于哈希表实现的,对于哈希索引列的数据通过 Hash 算法计算,得到对应索引列的哈希码形成哈希表,由哈希码及哈希码指向的真实数据行的指针组成了哈希索引。
哈希索引的特点
哈希索引只适用于等值查询,不支持范围查询。等值查询包括 =、IN()、<=> (安全等于, select null <=> null 和 select null=null 是不一样的结果)
哈希索引的性能
哈希索引的性能跟哈希冲突数量成反比,哈希冲突越多其维护代价越大性能越低 。Hash 碰撞通用的处理方法是使用链表,将 Hash 冲突碰撞的元素形成一个链表,发生冲突时在链表上进行二次遍历找到数据。
Hash 碰撞跟选择的 Hash 算法有关系,为了减少 Hash 碰撞的概率,优先选择避免 Hash 冲突的 Hash 算法,例如,使用 Percona Server 的函数 FNV64() ,其哈希值为 64 位,出现 Hash 冲突的概率要比 CRC32 小很多。
InnoDB中的自适应哈希索引
InnoDB 自适应哈希索引是为了提升查询效率,InnoDB 存储引擎会监控表上各个索引页的查询,当 InnoDB 注意到某些索引值访问非常频繁时,会在内存中基于 B+Tree 索引再创建一个哈希索引,使得内存中的 B+Tree 索引具备哈希索引的功能,即能够快速定值访问频繁访问的索引页。
为什么要为 B+Tree 索引页二次创建自适应哈希索引呢?
因为 B+Tree 索引的查询效率取决于 B+Tree 的高度,在数据库系统中通常 B+Tree 的高度为 3~4 层,所以访问数据需要做 3~4 次的查询。而 Hash 索引访问通常一次查找就能定位数据(无 Hash 碰撞的情况),其等值查询场景 Hash 索引的查询效率要优于 B+Tree。
InnoDB自适应哈希索引开关
InnoDB 自适应哈希索引的功能,用户只能选择开启或关闭功能,无法进行人工干涉。
功能开启后可以通过 Show Engine Innodb Status 看到当前自适应哈希索引的使用情况:
Hash table size 276707, node heap has 0 buffer(s)
0.00 Hash searches/s, 0.00 non-Hash searches/s
可以看到 Hash table 的大小,使用情况及每秒使用 AHI 和非 AHI 搜索的情况。