比B+Tree更快的查询结构!//MySQL、B+Tree、AHI、查询结构、Java、经验分享

基于STM32F103C8T6的红外循迹避障小车 编程思路:控制核心板IO口的电平(即电机驱动模块的AIN1,AIN2,BIN1,BIN2)从而控制AO1、AO2、BO1、BO2的电平高低,进而控制电机使其正转、反转、不转。由于单纯地拉高拉低电平只能让电机在转与不转的状态切换,故决定利用TIM4的两个通道分别产生两路PWM信号来控制电机速度,四个电机两个一组,同一侧的两个连接在同一个PWM上。(#include "dianji.h"文件中同时写了对循迹模块引脚的初始化) 阅读详情

导读

我们都知道MySQL中的B+Tree索引结构,对于根据某个条件查找记录是非常快的。那么,在不断追求极致的驱动下,你有没有想过MySQL会不会有比B+Tree更快的数据结构,来加速查找记录的性能呢?答案是有的,MySQL为了让我们更快地获取自己想查找的记录,在InnoDB中,将查询频繁的条件和索引树结果做了一个Hash映射,这样,一个查询就不需要每次搜索B+Tree去定位结果了,这个Hash映射就叫做AHI,全称Adaptive Hash Index,自适应哈希索引。

一听这名字,你或许已经猜出个一二了。没错!它其实就是一个HashTable,从《数据结构》这本书,我们都知道Hash Table在查找其中的一个节点的数据是非常快的,算法时间复杂度O(1),所以,相比B+Tree而言,它的查找性能一定是更快的。

但是,有个问题:为什么这个Hash Table叫做自适应哈希索引呢,这个“自适应”是什么概念?

今天,我们就从下面这个案例开始,详细讲解AHI,逐步带你明白AHI这个自适应是怎么一回事?

假设我们交友平台有个功能:筛选出年龄在15到23之间的用户。那么,通常我们会用下面这条SQL实现:

SELECT id, age, sex FROM user WHERE age >= 15 AND age <= 23

同时,我们给user表建了一个索引index_age_sex(age,sex),那么,现在我们再来看看这条SQL是如何使用AHI的?

AHI

既然AHI也是一个HashTable,那首先,你肯定会关心,它的Key是什么样的,Value又是什么样的?那么,我们就先来看看AHI的Key和Value。

我们看到《导读》中的语句的查询条件为age >= 15 AND age <= 23,按照上面我说的AHI的含义:将某一个查询条件和其结果做了一个Hash映射,那么,我们想象中的这个HashTable就类似下面这样:

图中上面的age >= 15 AND age <= 23代表查询条件,也就Key,下面为索引index_age_sex中满足查询条件的4条记录,也就是Value。其中,每条记录的结构为[age,sex,id]。

Key

但是,从上面的图来看,如果查询条件的字段名很长,那么,Key存储的空间也就变得很大,对于MySQL这种内存敏感的系统而言肯定是不能接受的,因此,MySQL设计了下面的这种结构来存放Key:

如上图为查找索引index_age_sex时,查询条件为age >= 15 AND age <= 23的结构:

  • search_info::n_fields:MySQL使用n_fields来表达查询索引使用到的字段,图中1表示查询条件使用到了索引index_age_sex中的第一个字段,即age。(PS:如果n_fields=2表示查询条件使用到了索引index_age_sex中的age和sex两个字段)。这样做的好处是我们在内存中存储数字就可以表达一个查询条件使用到的索引字段了,更节省存储空间。

  • dtuple_t:由于查询条件是一个范围查询,所以,MySQL使用两个dtuple_t结构来表示条件中的两个边界值。如上图,右边第一个dtuple_t中的15表示查询条件左边界值15,第二个dtuple_t中的23表示查询条件右边界值23。

最终,MySQL通过两个search_info::n_fields和dtuple_t的组合来表达查询条件age >= 15 AND age <= 23。如上图中的两个箭头表示的就是这种组合。

讲完Key,我们再来看看MySQL是如何设计HashTable的Value的?

Value

当然,如果按照上面的HashTable的结构,我们肯定认为查询条件age >= 15 AND age <= 23,其在HashTable中的Value就是上面图中1-1中的下面的记录。但是,我们现在来看下面一个场景:

假设现在我将查询条件变为age >= 15 AND age < 16,那么,这个HashTable就变成这样:

 

图中上面的age >= 15 AND age < 16代表查询条件,下面为索引index_age_sex中满足查询条件的2条记录,其中,每条记录的结构为[age,sex,id]。

通过对比1-1和1-2-1上面两张图,我们发现2个查询条件对应的查询结果中有重复记录15,0,2和15,0,5。现在只有2个查询条件会出现重复记录,那么,如果将来有几十个,甚至上百个查询条件都包含重复记录,那么,如果每个条件和对应结果都存一份HashTable,是不是在存储空间上就很浪费了?

因此,为了节省查询结果的存储空间,我们可以将上面2个查询HashTable合并,变成下面这样的结构:

图中MySQL将条件age >= 15 AND age <= 23和条件age >= 15 AND age < 16对应的记录合并为4条:

  • 条件age >= 15 AND age <= 23映射前两条记录。如上图绿色箭头。
  • 条件age >= 15 AND age < 16映射后两条记录。如上图红色箭头。

但是,在讲述Key的结构时,我说了MySQL真实设计的Key结构如图1-1-1,对应到图1-2-2,显然图1-2-2中的Key不是MySQL真实存储的结构。那么,结合1-2-2的HashTable概念图,我们来看下MySQL到底是如何设计AHI的Key和Value的映射的?

如上图,是MySQL完整的AHI的存储结构。其中,Value上面的部分就是Key,上面我已经讲解过Key的结构,这里我就不再重述了。我们主要看下Value部分:

 

  • Cell:在AHI中叫做hash_cell_t,hash_cell_tuple的缩写。也就是图中的cell这部分。它是一个数组,如上图是一个包含2个cell的数组。每个查询条件的边界值通过hash运算可以定位到某一个cell。比如:

    • 图中条件age >= 15 AND age <= 23中的左边界值15,通过hash运算定位到了第1个cell。
    • 图中条件age >= 15 AND age < 16中的左边界值15,通过hash运算也定位到了第1个cell。
    • 图中条件age >= 15 AND age <= 23中的右边界值23,通过hash运算也定位到了第1个cell。
    • 图中条件age >= 15 AND age < 16中的右边界值16,通过hash运算定位到了第2个cell。
  • Node:在AHI中叫做ha_node_t,hash_node_tuple的缩写。一个cell下可以包含多个node,也就是说多个查询条件边界值通过hash运算可以定位到一个cell,该cell下就存放了每个边界值对应的node记录,该cell下的每个node还组成了一个单向链表。

    • 比如,图中查询条件age >= 15 AND age <= 23中的左边界值15,通过hash运算,定位到第1个cell,该cell下的第1个node保存了15对应的记录(15,0,2)相关信息。

    • 同理,图中查询条件age >= 15 AND age <= 23中的右边界值23,通过hash运算,也定位到第1个cell,该cell下的第2个node保存了23对应的记录相关信息。

    • 同理,图中查询条件age >= 15 AND age < 16中的右边界值16,通过hash运算,定位到第2个cell,该cell下的第1个node保存了16对应的记录(16,0,3)相关信息。

    • 这两个node组成了一个单向链表。

    Node核心元素主要是3个:

    • block:存储hash映射的结果对应的相关信息。其中,核心元素包含left_side和page。

      • 比如,图中左边block里的curr_left_side = true,表示该node中的记录<15,0,2>是查询条件age >= 15 AND age <= 23和age >= 15 AND age < 16的最左边界记录。
      • 比如,图中左边block中的page(10)表示该node中的记录<15,0,2>在索引树index_age_sex的10号叶子节点内。
      • 比如,图中右边block里的curr_left_side = false,表示该node中的记录<16,0,3>是查询条件age >= 15 AND age < 16的最右边界记录。
      • 比如,图中右边block中的page(20)表示该node中的记录<16,0,3>在索引树index_age_sex的20号叶子节点内。
    • data:hash映射的结果。

      • 比如,图中第1个node中的<15,0,2>为条件age >= 15 AND age <= 23和age >= 15 AND age < 16左边界值15对应的记录。
      • 比如,图中第3个node中的<16,0,3>为条件age >= 15 AND age < 16右边界值16对应的记录。

现在我们知道了AHI的完整结构,通过这个结构,我们发现MySQL没有直接将查询条件和结果做了映射,而是通过cell将条件和结果关联起来,这样做的好处就是相同条件边界值对应的node在内存中可以共享,节省了存储空间。

查询AHI

说了那么多,是不是发现好像这个AHI结构并没有完整存储查询条件对应的所有结果记录,(毕竟我要的可是4条满足条件的记录哦!),那MySQL又是怎么通过AHI找到所有满足条件的记录呢?下面我们就以age >= 15 AND age < 16这个查询条件为例,来看一下这个查找过程:

  1. 根据条件左边界值15,做hash运算,计算得到一个fold值,通过该值定位到第1个cell。

  2. 遍历第1个cell下的node,找到第1个node为边界值15对应的node。

  3. 根据第1个node找到对应的记录<15,0,2>、page(10)和curr_left_side=true。

  4. 根据上一步得到的page编号10和记录<15,0,2>,在索引树index_age_sex中的10号叶子节点中找匹配<15,0,2>的记录<15,0,2>。

  5. 根据条件右边界值16,做hash运算,计算得到一个fold值,通过该值定位到第2个cell。

  6. 遍历第2个cell下的node,找到第1个node为边界值16对应的node。

  7. 根据第1个node找到对应的记录<16,0,3>、page(11)和curr_left_side=false。

  8. 根据上一步得到的page编号11和记录<16,0,3>,在索引树index_age_sex的11号叶子节点中找到匹配<16,0,3>的记录<16,0,3>。

  9. 由于第3步中记录<15,0,2>所在node中curr_left_side=true,说明记录<15,0,2>为查询条件最左记录,因此,从索引树index_age_sex的10号叶子节点内<15,0,2>记录开始,向后遍历其他记录。

  10. 由于第7步中记录<16,0,3>所在node中curr_left_side=false,说明记录<16,0,3>为查询条件最右记录,故上一步遍历到记录<16,0,3>结束。

  11. 最终,在索引树index_age_sex中找到所有满足条件age >= 15 AND age < 16的记录。

构建AHI时机

现在我们知道了MySQL如何通过AHI找到满足条件的记录了,那么,这个AHI又是在什么时候创建的,如何创建的呢?

在《导读》中我讲过,MySQL对使用频繁的查询条件才构建AHI,即条件与结果的映射关系。因此,我们就要看看MySQL是如何判断这个查询条件是否频繁使用的?

为了统计一个条件使用的频率,MySQL设计了下面这样一种结构。

是不是有点眼熟?其实,图中search_info就是查询信息的结构,在图1-1-1中,我讲了search_info中的一个属性n_fields,现在,我再讲另一个属性hash_analysis。

当一次查询成功后,MySQL通过累加该属性,记录该次查询成功的次数。比如,初始hash_analysis=0,那么,条件age >= 15 AND age < 16查询成功一次,hash_analysis + 1 = 1,再成功一次,hash_analysis + 1 = 2,依次类推,成功多少次,hash_analysis就是多少。

当hash_analysis值超过17时,MySQL就会对该查询构建AHI。

但是,查询成功,就一定能够构建AHI吗?答案是不一定!我们来看下面这个场景:

SELECT age, sex FROM user WHERE age >= 15 AND age <= 18

上面这条语句,MySQL在索引index_age_sex中的叶子节点找到满足条件的记录为下面4条:

<15,0,2>、<16,0,3>、<18,0,4>、<18,0,5>

这时候,我们再看下这个条件查找AHI的过程:

 

  1. 根据条件左边界值15,做hash运算,计算得到一个fold值,通过该值定位到第1个cell。

  2. 遍历第1个cell下的node,找到第1个node为边界值15对应的node。

  3. 根据得到的node找到对应的记录<15,0>、page(10)和curr_left_side=true。

  4. 根据上一步得到的page编号10和记录,在索引树index_age_sex中10号叶子节点中找到匹配node记录<15,0>的第一条记录<15,0,2>。

  5. 根据条件右边界值18,做hash运算,计算得到一个fold值,通过该值定位到第2个cell。

  6. 遍历第2个cell下的node,找到第1个node为边界值18对应的node。

  7. 根据得到的node找到对应的记录<18,0>、page(11)和curr_left_side=false。

  8. 根据上一步得到的page编号11和记录,在索引树index_age_sex11号叶子节点中找到匹配node记录<18,0>的第一条记录<18,0,4>。

  9. 由于第3步中记录<15,0>所在node中curr_left_side=true,说明记录<15,0,2>为查询条件最左记录,因此,从索引树index_age_sex的10号叶子节点内<15,0,2>记录开始,向后遍历其他记录。

  10. 由于第7步中记录<18,0>所在node中curr_left_side=false,说明记录<18,0,4>为查询条件最右记录,故上一步遍历到记录<18,0,4>结束。

从上面的过程,我们发现一个问题:明明11号叶子节点中的记录<18,0,5>也满足条件age >= 15 AND age <= 18,但是,AHI查询却忽略这条记录。如上图,虚线标出的记录。PS:上面第9步,现在就2条件满足右边界值18的记录,如果满足的记录超过1k、1w条呢?让MySQL遍历1k、1w次叶子节点记录来定位最大记录嘛?这个性能可想而知。

因此,我们发现这类查询是不能支持AHI的,我们不能简单地认为只要查询成功,就等于可以构建AHI。

为此,MySQL在search_info中引入了一个新的属性,我们来看下:

如上图中的n_hash_potential就是这个新属性,它表示一次查询潜在可以成功构建AHI的次数。用它来解决上面那个场景的问题:

只有查询得到的结果中,最大的记录中的select字段值(比如:select age,sex)唯一,n_hash_potential才会累加。

这样一来,MySQL就在真正构建AHI之前做了两次拦截:

  • 通过hash_analysis将该属性值小于17的查询拦截,只有该属性值大于等17,这次查询才能构建AHI
  • 如果hash_analysis大于等于17,那么,再检查n_hash_potential属性,如果该属性值小于100,查询拦截,反之,这次查询才能构建AHI

那么,下一个问题来了:既然我都已经知道上面那个场景是不可能构建AHI的,我为什么还要让查询处理进入上面两次拦截检查呢?

因此,为了避免进入上面的拦截检查,MySQL又在search_info中引入了一个属性:

图中last_hash_succ属性,它表示上一次是否成功构建AHI。

有了这个属性,MySQL只要发现上面这个场景压根er不能构建AHI,因此,直接就设置last_hash_succ=false,那么,在下次相同查询进来后,直接发现last_hash_succ=false,就不再进行后面两次的拦截检查。

通过上面的分析,我们就得出了一次查询触发AHI构建的检查过程:

  1. 如果last_hash_succ=false,该查询不能构建AHI,反之进入下一步检查

  2. 如果hash_analysis < 17,该查询不能构建AHI,反之进入下一步检查

  3. 如果n_hash_potential < 100,该查询不能构建AHI,反之可以构建AHI

构建AHI

讲完AHI构建的触发条件,我们最后来看看MySQL是如何构建AHI的?

通过《查询AHI》部分的讲解,我们知道查询AHI的过程中,AHI中的Node中包含几个核心元素block、left_side和page,因此,我们只要知道这几个核心元素是如何构建的,也就能够描述清楚AHI的构建过程了。

我以下面这条语句为例,看下AHI构建的过程:

SELECT id, age, sex FROM user WHERE age >= 15 AND age <= 18

关注图中红线部分:

  1. 根据条件左边界值15,在索引树index_age_sex中的10号叶子节点中找到满足边界值的第一条记录<15,0,2>。

  2. 由于找到满足左边界值15的记录只有一条,因此,MySQL将up_match + 1 = 1,表示只有一条记录满足左边界值。由于up_match > low_match,因此,search_info中的left_side设置为true。

  3. 根据条件左边界值15,对其做hash运算,定位到AHI中的第1个cell。

  4. 发现cell中没有node节点,创建一个node。即图中灰色的node节点。

  5. 在node中创建一个block。如上图浅蓝色的block。

  6. 将索引树index_age_sex中的10号叶子节点信息写入block中的page属性。

  7. 将第2步得到的left_side写入block中的curr_left_side。

  8. 将第1步得到的记录<15,0,2>写入node。

  9. 同理,条件右边界值18构建AHI的过程相同。

AHI锁

了解完AHI的构建过程后,我们进一步会想,如果并发构建AHI,会出现node覆盖的问题。因此,为了解决这个问题,MySQL就必须给AHI加一把锁,避免并发构建时产生node覆盖的问题。

当然,我们不能给整个AHI加全局锁吧,因为这样会非常影响查询的性能,因此,MySQL是这样设计锁的。

 MySQL在启动时,从innodb_buffer_pool中划分出若干个Hash Table,作为AHI,图中,我画了2个HashTable:HashTable[0]和HashTable[1]。假设MySQL通过4个查询条件hash运算得到4个fold,如上图4个fold值分别为1、2、9和17。

那么,MySQL对AHI加锁的方式为fold % 8取模:

  • 1和2取模后,得到0,因此,这两个fold对应的查询在HashTable[0]中构建AHI,同时,加同一把锁Lock0。
  • 9和17取模后,得到1,因此,这两个fold对应的查询在HashTable[1]中构建AHI,同时,加同一把锁Lock1。

通过这种方式,MySQL就可以将锁分散加在不同的HashTable上,尽可能减少并发导致的HashTable构建锁死造成的性能问题。

AHI调优

MySQL是默认开启AHI的,既然我们知道MySQL通过fold取模将AHI锁打散到多个HashTable上,也就意味着打散后的HashTable越多,AHI锁就打得更散,锁的粒度就更细,并发查询后构建AHI的性能就更好。

因此,MySQL给我们留了一个参数,用来将锁粒度打得更细,这个参数叫做innodb_adaptive_hash_index_parts:HashTable分片个数,默认为8。

我们只需要执行下面的语句就可以调大这个参数,将锁粒度打散得更细:

set global innodb_adaptive_hash_index_parts=16;

小结

本章中,小k详细讲解AHI的结构、查询、构建、加锁等原理,同时,提供了AHI参数调优的方法。

现在回答文章开头的问题:为什么MySQL把这个HashTable叫做自适应哈希索引呢?

通过AHI构建的过程,我们发现,多个查询构建cell中的node,是可以变大或缩小的,正是这个原因,MySQL才把这样一个HashTable叫做AHI,即自适应哈希索引。

思考题

最后留一个思考题:在文中《构建AHI》部分中,我有提到up_match和low_match属性,我们明明可以通过查询条件是>或<来判断left_side为true还是false,为什么还要通过up_match和low_match来判断呢?

提示:结合索引多列查询场景思考。

最后,这篇文章我们尽力把艰深的技术讲透讲俗,哪怕你不是这个领域的,也希望你有所收获,如果你觉得文章还不错,记得点赞、关注哦。

如果有看不懂的地方,欢迎在评论区提问~


需要学习资料的加QQ群我们一起交流分享:731892759
免费领取三套价值3000元的Java资料:
1、Java自学超详细电子书
2、自录优质网络直播课
3、大厂Java面试题,优质项目练习题
…….

部分资源预览~我们一起学习吧

Linux 服务器上部署 OpenClaw完整教程 2. 全局安装 OpenClaw 3. 初始化配置 配置模型提供商 方式一:使用配置命令(推荐) 方式二:直接编辑配置文件 在 部分添加: 配置多个模型提供商 如果你使用 Antigravity 本地代理,可以同时配置多个模型: 配置飞书集成 1. 创建飞书应用 访问 飞书开放平台 创建企业自建应用 记录 App ID 和 App Secret 2. 配置应用权限 在飞书开放平台,为应用添加以下权限:重要: 必须使用 长连接(WebSocket) 模式,不要使用 HTTP 回调!在飞书开放 阅读详情

相关推荐

微信小程序OCR身份证识别实战:从拍照到信息提取全流程解析

本文详细解析了微信小程序中OCR身份证识别的全流程实现,从环境配置、拍照上传到OCR核心识别及安全优化。通过微信开发者工具和OCR插件,开发者可快速构建高效的身份信息采集系统,提升用户体验和数据安全性。重点介绍了图像处理、加密传输及混合云架构等企业级解决方案。

j0k1l2m3n的博客 458

查找、插入、删除都很快的数据结构(散列表vs红黑树vs跳表)

散列表 散列表的插入、删除、查找操作的时间复杂度可以做到常量级的 O(1),非常高效。 平衡二叉查找树(红黑树) 二叉查找树在比较平衡的情况下(红黑树是一种平衡二叉树),插入、删除、查找操作时间复杂度是 O(logn)。 跳表 跳表,插入、删除、查找操作时间复杂度是 O(logn)。 散列表 vs 二叉查找树 相对散列表,二叉查找树好像并没有什么优势,那我们为什么还要用二叉查找树呢? 第一,...

网络安全研究 8207

东方财富API隐藏技巧:这样获取分时均价线数据更稳定(避坑指南)

本文深入解析东方财富API获取股票分时数据,特别是分时均价线的实战技巧与避坑指南。针对高频调用中常见的请求失败、数据错位及IP限制等问题,提供了从接口参数深层解析、稳健请求与错误处理机制,到系统优化与数据校验的全流程解决方案,帮助开发者构建稳定可靠的数据采集系统。

rice5的博客 2541

深入浅出双数组Trie树

对于字符串来说,还有一种查询效率较高的数据结构,叫做Trie树。 比如我们有一系列的字符串:{bachelor#, bcs#, badge#, baby#, back#, badger#, badness#},我们之所以每个字符串都加上#,是希望不要一个字符串成为另外一个字符串的前缀。把它们放在Trie树中,如图所示。 在这棵Trie树中,每个节点都包含27个字符。最上面的是根节点,如果字符串的第一个字符是“b”,则“b”的位置就有一个指针指向第二个层次的节点,从这一层的节点开始,下面挂的整棵树

ludongguoa的博客 785

YOLO11实战 第001期-基于yolo11的CrowdHuman密集行人目标检测实战文档(yolo格式数据免费获取)

1.数据阶段在拥挤/遮挡场景下,使用crowdhuman数据集重训练后的yolo11,效果表现较好。crowdhuman数据集标签如下,有Head BBox、Visible BBox、Full BBox。如下图显示:数据集介绍CrowdHuman数据集是旷世发布的用于行人检测的数据集,图片数据大多来自于google搜索。CrowdHuman数据集数据量比较大,15000张,5000张,验证集4370张。训练集和验证集中共有470K个实例,约每张图片包含23个人,同时存在各种各样的遮挡。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 2168

【UE5】Vosk插件实战:离线语音识别与TTS朗读全流程解析

本文详细解析了如何在UE5中利用Vosk插件实现离线实时语音转文字功能。从环境配置、插件与模型准备,到核心C++组件封装与蓝图系统搭建,提供了完整的实战教程。重点解决了离线语音识别在游戏开发中的延迟、隐私和网络依赖问题,并演示了从语音识别到TTS朗读的完整交互闭环,为开发安全、实时的语音交互应用提供可靠方案。

weixin_29021291的博客 513

高效率的查找神器--哈希表

本文从数据结构角度认识哈希表,更多关于Java编程中HashMap的用法见:对HashMap的简单认识 1. 什么是哈希表 哈希表名字源于 Hash,也可以叫作散列表。哈希表是一种特殊的数据结构,它与数组、链表以及树等数据结构相比,有很明显的区别。 2. 哈希表的核心思想 在数组、链表以及树等数据结构中,数据的存储位置和数据的具体数值之间不存在任何关系。因此,在面对查找问题时,这些数据结构必须采取逐一比较的方法去实现。 而哈希表的设计采用了函数映射的思想,将记录的存储位置与记录的关键字关联起来。这样的设计方

Yangchenju的博客 1378

SMPLify-X关键点映射与OpenPose格式转换实战

本文深入解析了SMPLify-X与OpenPose之间关键点映射与格式转换的实战方法。针对SMPL、SMPL-H、SMPLX等参数化人体模型与OpenPose 2D姿态估计标准之间的数据鸿沟,文章详细对比了双方的关键点定义差异,并提供了核心的Python转换代码与映射表构建思路。通过清晰的步骤讲解与调试技巧,帮助开发者实现3D关节数据到OpenPose标准格式的高效、准确转换,为动作捕捉、3D姿态估计等应用奠定数据基础。

weixin_29046035的博客 166

以下哪种数据结构的查找效率最高

网易2017实习生招聘笔试题-Java开发工程师 以下哪种数据结构的查找效率最高 A 二叉树 B 队列 C 栈 D hash 个人参考答案:D欢迎下方讨论交流

xhyxxx的博客 2万+

港口集装箱码头运营FlexSim仿真

列队4中的集装箱会根据不同类型的集装箱会放置在不同的堆场,因此根据前面对集装箱设置的标签Type的数值不同,设置不同的发送端口。集装箱到达列队3后,会有70%的集装箱到达堆场,30%的集装箱运出港口,因此在Queue列队3的Flow界面设置按照百分比发送端口,其中70%发送到端口1,即发送到列队4等待进入堆场,30%发送到端口2,即发送至出闸口。通过上述对比表格可以看出,当集卡数量在10的时候,岸桥和场桥的设备利用率达到了最高,当集卡数量为12的时候场桥1和场桥3的利用率有所下降,因此综合考虑。

m0_72514516的博客 1331

DC-DC BUCK电路 PCB 布局布线 5 要点:以 XL4015 12V转5V 为例解析噪声控制

本文以XL4015 12V转5V降压电路为例,详细解析DC-DC BUCK电路PCB布局布线的5个关键要点,重点探讨噪声控制策略。通过功率回路最小化、热管理与接地优化、电感电容布局、反馈网络防干扰设计以及实测验证技巧,帮助工程师实现高效稳定的电源设计,显著降低输出纹波和电磁干扰。

weixin_29165725的博客 370

【算法与数据结构 10】哈希表——高效查找的利器

大家都在看的高效《数据结构与算法》!

不积跬步,无以至千里! 8165

Unity 实战项目 ☀️| 只用一个脚本做一个 刮刮乐 案例,一不小心刮出来一个女朋友!【学习娱乐一下】

只用一个脚本做一个刮刮乐,一不小心刮出来一个女朋友!【学习娱乐一下!】

努力前行,总会成为自己心中的那道光 23万+

比B+Tree更快,查询速度飙升的秘密武器

我们都知道MySQL中的B+Tree索引结构,对于根据某个条件查找记录是非常快的。那么,在不断追求极致的驱动下,你有没有想过MySQL会不会有比B+Tree更快的数据结构,来加速查找记录的性能呢?答案是有的,MySQL为了让我们更快地获取自己想查找的记录,在InnoDB中,将查询频繁的条件和索引树结果做了一个Hash映射,这样,一个查询就不需要每次搜索B+Tree去定位结果了,这个Hash映射就叫做AHI,全称Adaptive Hash Index,自适应哈希索引。一听这名字,你或许已经猜出个一二了。

资料免费分享,点击名片 237

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

简单理解MySQL的AHI自适应hash索引

AHI的主要作用是加速对内存中的数据的访问,特别是针对高频的单列等值查询。此外,AHI还具有自适应性,能够根据查询模式和系统负载自动调整哈希表的大小和结构,以优化查询效率。当观察到建立哈希索引可以带来速度提升时,会自动为某些热点页建立哈希索引,这一过程是动态的,不需要用户手动创建或管理。总之,AHI索引是MySQL中一种非常有用的索引类型,能够显著提高查询性能。在实际应用中,我们需要根据具体场景选择合适的索引类型,以达到最佳的查询效果。在MySQL的源码中,AHI的实现涉及多个函数和数据结构。

qq_37679639的博客 1164

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

不是吧 不是吧 还有比B+Tree更快的一种查询结构

我们都知道MySQL中的B+Tree索引结构,对于根据某个条件查找记录是非常快的。那么,在不断追求极致的驱动下,你有没有想过MySQL会不会有比B+Tree更快的数据结构,来加速查找记录的性能呢?答案是有的,MySQL为了让我们更快地获取自己想查找的记录,在InnoDB中,将查询频繁的条件和索引树结果做了一个Hash映射,这样,一个查询就不需要每次搜索B+Tree去定位结果了,这个Hash映射就叫做。一听这名字,你或许已经猜出个一二了。没错!

jjc4261的博客 321

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

mysql_row数据结构_Innodb物理存储结构系列2 行记录格式

前一篇讨论了Innodb system,表空间,文件的关系及数据结构,这一篇记录下Innodb行记录的格式。前提:1. server层和innodb层都有自己对于record的记录格式,需要进行转换。2. 物理文件上的记录存储,需要内存中的数据结构进行对应(任何数据都需要在内存中进行处理),进行存取的转换。1. 测试case:create table `pp` (`id`int(11) defau...

weixin_39692245的博客 435

解锁高效检索技能:掌握MySQL索引数据结构的精髓

在Java中,synchronized关键字是一种同步锁,在多线程编程中,用于解决多个线程同时访问同一个资源的问题。当一个线程持有锁时,其他线程将会被阻塞,直到当前线程释放锁为止。synchronized可以加在方法上或对象上,作用的对象是非静态的,则取得的锁是对象锁;作用的对象是静态方法或类,则取到的锁是类锁,这个类所有的对象用的是同一把锁。

我是Java程序员廖志伟,感谢朋友们的支持! 321

MySQL索引的数据结构、特点(Keywords:InnoDB、B+Tree、Hash)

B+树索引    在数据库中,B+树是高度平衡的,树的高度一般都在2 ~ 4层,所以查某一键值的行记录最多需要2 ~ 4次 IO。B+ 树索引种类分为聚集索引(clustered index)和辅助索引(secondary index) 聚集索引(clustered index)    聚集索引按照每张表中的主键顺序构建B+树(每张表只能有一个主键,故每张表只能有一个聚集索引),其叶子节点存放所有的行数据, ...

BigBug_500的博客 877

MySQL索引:让你的数据库查询快到起飞!

MySQL索引的查看、创建和删除以及索引的底层原理B+树

不能再留遗憾了的博客 2913

不是吧!不是吧!竟然有比B+Tree更快的一种查询结构

我们都知道MySQL中的B+Tree索引结构,对于根据某个条件查找记录是非常快的。那么,在不断追求极致的驱动下,你有没有想过MySQL会不会有比B+Tree更快的数据结构,来加速查找记录的性能呢?答案是有的,MySQL为了让我们更快地获取自己想查找的记录,在InnoDB中,将查询频繁的条件和索引树结果做了一个Hash映射,这样,一个查询就不需要每次搜索B+Tree去定位结果了,这个Hash映射就叫做AHI,全称Adaptive Hash Index,自适应哈希索引。 一听这名字,你或许已经猜出个一二了。没错

weixin_47067712的博客 267

AHI对MySQL性能的影响

AHI对mysql性能的影响

DBA_ChenJR的博客 1622

MySQL性能优化:深入理解InnoDB的自适应哈希索引

​ MySQL的自适应哈希索引(Adaptive Hash Index,简称AHI)是InnoDB存储引擎的一项关键特性,旨在提升查询性能和数据库的整体性能。自适应哈希索引通过动态调整哈希表的大小,使其“刚刚好”,从而优化查询效率。这种索引技术在特定场景下能够显著提升查询性能,是一种高效的索引优化技术。

u013911096的博客 1872

mysql:InnoDB关键特性:自适应哈希索引(AHI)

一、自适应哈希索引(Adaptive Hash Index,AHI) 1. 定义 哈希(hash)是一种非常快的查找方法,在一般情况下这种查找的时间复杂度为O(1),即一般仅需要一次查找就能定位数据。而B+树的查找次数,取决于B+树的高度,在生产环境中,B+树的高度一般为3~4层,故需要3~4次的查询。 InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI)。AHI是通过缓冲池的B+树页构

wangdamingll的博客 1633

MySQL 索引优化:深入探索自适应哈希索引的奥秘

在数据库管理系统中,索引优化是提高查询性能的关键所在。MySQL 作为最流行的开源关系型数据库管理系统之一,提供了多种索引类型以满足不同查询场景的需求。其中,自适应哈希索引(Adaptive Hash Index,AHI)是 InnoDB 存储引擎提供的一种高级索引优化技术,它能够在特定情况下显著提升查询性能。本文将深入探讨自适应哈希索引的工作原理、使用场景以及如何充分利用它进行性能优化。

码到三十五 2万+

Mysql——》哈希索引

AHI = Adaptive Hash Index = 自适应哈希索引 InnoDB存储引擎内部自己去监控索引表,如果监控到某个索引经常用,那么就认为是热数据,然后内部自己创建一个hash索引,称之为自适应哈希索引。创建以后,如果下次又查询到这个索引,那么直接通过hash算法推导出记录的地址,直接一次就能查到数据,比重复去B+tree索引中查询三四次节点的效率高了不少。 AHI是 InnoDB 存储引擎的一种索引优化技术,它可以根据访问模式实时地调整和优化哈希索引结构,提高查询速度和效率。

小仙~ 1022
上一篇: 拒绝做焦虑贩卖者的韭菜 自主学习、焦虑、职业发展、乐观生活、资源免费分享
下一篇: Java实现简易联网坦克对战小游戏(内涵源码)//Java+Java游戏+拓展学习+资源分享
Java研究社
博客等级 码龄5年 4粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值