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来查询。

InnoDB Adaptive Hash Index(AHI)相关推荐

  1. MySQL · 引擎特性 · InnoDB Adaptive hash index介绍

    一 序 先看官网上的介绍(翻译来自MK提丰 ) The adaptive hash index (AHI) lets InnoDB perform more like an in-memory dat ...

  2. MySQL(七):InnoDB 自适应Hash索引(Adaptive Hash Index)

    文章目录 1.简述 2.AHI(Adaptive Hash index)创建条件及注意事项 3.AHI(Adaptive Hash index)监控 3.1.通过 *show engine innod ...

  3. 一文带你了解MySQL之Adaptive Hash Index

    前言 在InnoDB体系架构图的内存结构中,还有一块区域名为:Adaptive Hash Index,翻译成中文:自适应哈希索引,缩写:AHI,它是一个纯内存结构,我们今天就来了解它. 目录 一.My ...

  4. Adaptive Hash Index(自适应hash索引)

    文章目录 1.1 什么是hash索引 1.2 什么是自适应hash索引 1.3 自适应hash索引原理 1.4 相关变量 1.5 监控指标 1.6 总结 1.1 什么是hash索引   哈希索引基于哈 ...

  5. [原理解析] Adaptive Hash Index 是如何建立的

    Adaptive Hash Index (以下简称AHI) 估计是 MySQL 的各大特性中,大家都知道名字但最说不清原理的一个特性.本期图解我们为大家解析一下AHI是如何构建的. 首先我们思考一下A ...

  6. mysql单表最大数据量_你的Mysql库真需要Adaptive Hash Index

    说起AHI(Adaptive Hash Index),有的同学估计很陌生,都没听说,没关系,下面我会详细解释说明的,AHI是什么,mysql库为什么要设计AHI,解决什么问题,只有了解这些原理之后,才 ...

  7. mysql hash创建_Mysql自适应哈希索引(Adaptive Hash Index)创建的条件

    官方文档: If a table fits almost entirely in main memory, a hash index can speed up queries by enabling ...

  8. mysql 散列查询_MySQL InnoDB中hash查找表的实现

    MySQL版本:5.7.14 源码位置为hash0hash.h hash0hash.cc 作为一种时间复杂度最优为O(1)的数据结构,但是最坏时间复杂对位O(n)的一种数据结构,但是在良好的设计has ...

  9. ​ RROR 1221 (HY000): Incorrect usage of spatial/fulltext/hash index and explicit index orde ​

    错误判断: RROR 1221 (HY000): Incorrect usage of spatial/fulltext/hash index and explicit index orde 类似这样 ...

  10. 不要滥用UNLOGGED table 和 hash index

    注意PostgreSQL的unlogged table是不记录xlog的,所以在备库上没有unlogged table的数据记录. 同时,数据库在进入恢复状态时,为了保证数据的一致性,postgres ...

最新文章

  1. sql字符串分隔函数
  2. nodejs中Buffer的创建和转换
  3. Midway Serverless 2.0,一体化让前端研发再次提效
  4. matlab 实验5,MATLAB实验5报告.doc
  5. 在win7在结构cocos2d-x v3.2rc0开发环境(For Android)
  6. NLP硬核入门-条件随机场CRF
  7. Android项目Tab类型主界面大总结
  8. 前端----CSS层叠样式表
  9. 计算机考研什么时候开始备考,上岸前辈告诉你,考研数学什么时候开始复习最好?...
  10. 联合密度函数求期望_已知(X,Y)的联合概率密度,分别求X,Y的期望、方差
  11. Javaweb网易云音乐
  12. html5初学者小游戏源代码,html5 一个“一笔画”小游戏源码(通关)
  13. 滑窗口统计基因组GC含量的分布
  14. 像素,分辨率,Retina屏幕
  15. 学生管理数据库,及相关查询
  16. 网络打印机无法接收打印命令
  17. 区块链-区块链的概念
  18. 20189218 2018-2019-2 《密码与安全新技术专题》第7周作业
  19. 功能测试工具SilkTest
  20. C/C++二维码生成库qrencode的使用

热门文章

  1. QGIS编译---QGIS3.10.6 + Qt5.11.2 + VS2015 ---32位版本
  2. MIPS中的异常处理和系统调用
  3. CentOS 7 systemd添加自定义系统服务
  4. 剑指 Offer(C++版本)系列:剑指 Offer 10- I 斐波那契数列
  5. 即时通讯开发之开源工程WebRTC原理
  6. JPEG与jpg的区别
  7. 硬件工程师要学习的东西
  8. Java实现对称加密
  9. Unity3d发布WebGL打包AssetBundle的材质球丢失问题
  10. 如何使用Clonezilla克隆Windows硬盘