InnoDB Adaptive Hash Index(AHI)


1. InnoDB AHI的作用
       InnoDB的适应哈希(AHI)是维护InnoDB叶子页记录的索引键值(或键值前缀)的到叶子节点记录的Hash映射关系。能够根据索引键值(或前缀)定位到记录的地址。这样可以不用再搜索B+树从root到叶子页的路径定位过程。

2. InnoDB AHI的维护
      为了避免频繁的更新AHI带来性能的开销,InnoDB的AHI不是随时可以更新的。
首先要满足 index->search_info->hash_analysis >= BTR_SEARCH_HASH_ANALYSIS(17),即在这个索引上至少进行了17此查询(指通过B+树的路径查询,不包含通过AHI查找)才进行一次是否需要建hash的分析。
     
      分析是否需要建索引:
        buf_block_struct->n_hash_helps 用相同的前缀(n_fields,n_bytes,left_side)进行的查询 成功的次数(btr_search_update_block_hash_info).  如果次数大于该页记录总数的1/16时,就有可能在该页上建立AHI. 
       并且index->search_info->n_hash_potential >= BTR_SEARCH_BUILD_LIMIT(100),即表示查询已经连续成功使用Hash Index(btr_search_guess_on_hash), 或者是可能成功使用Hash Index的次数(btr_search_info_update_hash) 大于100.
      原来没有创建hash,或者原来创建hash的前缀参数发生了改变(n_fields, n_bytes, left_side),则需要重新对这个页上的记录创建AHI.

     索引的创建:
     如果需要创建新的AHI,如果原来在这页上已经建立和哈希索引,则需要先删除原来的这页上的AHI。建立新的AHI,从这页的第一个记录开始,到最后的一个记录,依次根据前缀的参数(n_fields,n_bytes,left_side)计算hash的key,然后插入哈希表中。

    插入记录时添加哈希记录:
    当一页插入一条记录时,如果这页已经被创建哈希,则将这个新记录也插入哈希表。函数: btr_search_update_hash_node_on_insert(); btr_search_update_hash_on_insert()。


3. InnoDB AHI前缀参数的确定:
    hash前缀参数(n_fields, n_bytes, left_side)的确定需要根据这次查询的结果来确定,即查询结束后 btr_cur_t结构中的参数来确定;主要是比较cursor->up_match, cursor->up_bytes, cursor->low_match, cursor->low_bytes,即查询结束后查询游标指向的前后记录的匹配程度来确定前缀的参数。
    以 匹配少的记录作为前缀,即cursor->up_match,cursor->up_bytes组合与cursor->low_match, cursor->low_bytes比较结果,如果前者大则用后者来更新info->n_fields和info->n_bytes,此时info->left_side = TRUE,即当遇到相同记录前缀时,是选择最左边插入hash表,后者大则用前者来更新info->n_fields和info->n_bytes,此时info->left_side = FALSE,当遇到相同记录前缀时,是选择最右边的记录插入hash表,即相同的前缀只用保留一个记录在hash表中。
    如果分析过程中发现查询的结果和上次得到的结果不同,则需要重新前缀参数(n_fields, n_bytes, left_side)。

4. InnoDB AHI使用
        在btr_cur_search_to_nth_level中,在使用B+Tree搜索前,先搜索AHI(btr_search_guess_on_hash),看是否可以找到相应的记录。查找到记录后还需要检查找到的记录是否符合要求(btr_search_check_guess),即根据Search Path(PAGE_CUR_G, PAGE_CUR_GE, PAGE_CUR_L, PAGE_CUR_LE)与tuple和当前记录的比较结果 btr_cur_t结构中的参数来判断。如果符合要求则返回相应的记录,否则还是采用B+Tree来查询。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值