哈希(hash)是一种非常快的查找方法,一般情况下查找的时间复杂度为 O (1),即一般仅需要一次查找就能准确定位。B+Tree的查找次数则取决于B+Tree的高度,在大多数的生产环境中,B+Tree的高度一般为3到5层,故需要3~5次的查询。
InnoDB存储引擎会监控对表上二级索引的查找。如果发现某二级索引被频繁访问,二级索引就成为热数据;如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应(adaptive)的,即自适应哈希索引(Adaptive Hash Index,AHI)。
经常访问的二级索引数据会自动被生成到hash索引里面(最近连续被访问3次的数据),自适应哈希索引通过缓冲池的B+Tree构造而来,因此建立的速度很快,而且不需要将整个表都建立哈希索引,InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引。
自适应哈希索引会占用InnoDB Buffer Pool,而且只适合搜索等值的查询,如select * from table where index_col='xxx';对于其他查找类型,如范围查找,是不能使用的。MySQL自动管理,人为无法干预。
查看当前自适应哈希索引的使用状况可以使用show engine innodb status\G命令,通过hash searches、non-hash searches计算自适应哈希索引带来的收益以及付出,确定是否开启自适应哈希索引。
对于某些工作负载,如使用like和%的范围查询以及高并发的joins,不适合使用自适应哈希索引,维护哈希索引结构的额外开销会带来严重性能损耗。这种情况更适合于禁用自适应哈希索引,建议关掉,尽管默认情况下仍然启用。可以通过“set global innodb_adaptive_hash_index=off/on”命令来关闭或打开该功能。