Mysql自适应哈希索引(Adaptive Hash Index)创建的条件

官方文档:

If a table fits almost entirely in main memory, a hash index can speed up queries by enabling direct lookup of any element, turning the index value into a sort of pointer. has a mechanism that monitors index searches. If notices that queries could benefit from building a hash index, it does so automatically.

翻译:

如果一个表几乎完全适合主内存,那么哈希索引可以通过直接查找任何元素来加快查询速度,将索引值转换为某种指针。具有监视索引搜索的机制。如果注意到查询可以从构建哈希索引中获益,那么它会自动这样做。

官方文档给出的内容非常含糊,并没有说明自适应哈希索引的创建条件,只是说自适应哈希索引会自动创建,没有细节。我从网上找到了一些资料虽然说的很详细,但是说的有点过于详细不能一目了然,所以我重新整理下。

自适应hash创建的条件:

自适应hash索引(AHI)在实现上就是一个哈希表:从某个检索条件到某个数据页的哈希表,仿佛并不复杂,但其中的关窍在于哈希表不能太大(哈希表维护本身就有成本,哈希表太大则成本会高于收益),又不能太小(太小则缓存命中率太低,没有任何收益)。所以在创建AHI上还是有一些讲究的。

  1. 索引被查询的次数足够多。如果查询次数用N1来表示的话那么N1应该大于17(N1>17),此过程无时间限制。

  2. 基于查询的sql语句创建一个hash信息(hash info)其中包含了三部分内容:

    1)匹配索引的列数

    2)下一列匹配的字节数

    3)是否从左匹配

    例如有如下SQL语句:

    select * from table1 where a1=1 and a2=2;
    

    则生成如下哈希描述:

    hash info(2, 0, true)
    

    如果这个生成的hash info被使用的次数足够多 (N2 > 100)

  3. 生成的hash info能够命中某个数据页,且命中的该页上的记录数要大于该页上总记录数的1/16(N3 > 页记录数的1/16)

满足以上三点要求那么就会将hash info生成一个key,value就是指向数据页上记录的指针。
这样就建立起了mysql的自适应哈希索引

参考资料:

http://mysql.taobao.org/monthly/2015/09/01/
https://mp.weixin.qq.com/s/bj6Qe98lWlrd4Hv5B0sn9w

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容