返回顶部
首页 > 资讯 > 数据库 >图解MySQL | [原理解析] Adaptive Hash Index 是如何建立的
  • 470
分享到

图解MySQL | [原理解析] Adaptive Hash Index 是如何建立的

图解MySQL|[原理解析]AdaptiveHashIndex是如何建立的 2014-10-02 19:10:45 470人浏览 无得
摘要

Adaptive Hash Index(以下简称 AHI)估计是 Mysql 的各大特性中,大家都知道名字但最说不清原理的一个特性。本期图解我们为大家解析一下 AHI 是如何构建的。 首先我们思考一下 AHI 是为了解决什么问题: 随着

图解MySQL | [原理解析] Adaptive Hash Index 是如何建立的

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

首先我们思考一下 AHI 是为了解决什么问题:

  • 随着 mysql 单表数据量增大,(尽管 B+ 树算法极好地控制了树的层数)索引 B+ 树的层数会逐渐增多;
  • 随着索引树层数增多,检索某一个数据页需要沿着 B+ 树从上往下逐层定位,时间成本就会上升;
  • 为解决检索成本问题,Mysql 就想到使用某一种缓存结构:根据某个检索条件,直接查询到对应的数据页,跳过逐层定位的步骤。这种缓存结构就是 AHI。

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

这就是 AHI(中文名:自适应哈希索引)中"自适应"的用途:建立一个"不大不小刚刚好"的哈希表。

本文主要讨论 MySQL 是如何建立起一个"刚刚好"的 AHI 的,如图 1 所示:需要经历三个关卡,才能为某个数据页建立 AHI,之后的查询才能使用到该 AHI。

我们逐个关卡来介绍: 关卡 1:某个索引树要被使用足够多次 AHI 是为某个索引树建立的(当该索引树层数过多时,AHI 才能发挥效用)。如果某索引只被使用一两次,就为之建立 AHI,会导致 AHI 太多,维护成本高于收益。因此建立 AHI 的第一关就是:只为频繁使用的索引树建立 AHI。

关卡 2:该索引树上的某个检索条件要被经常使用 显而易见,如果我们为了一个很少出现的检索条件建立 AHI,肯定是入不敷出的。

在此我们插播一个新概念 hash info,hash info 是用来描述一次检索的条件与索引匹配程度(即此次检索是如何使用索引的)。建立AHI时,就可以根据匹配程度,抽取数据中匹配的部分,作为 AHI 的键。关卡 2 就是为了找到经常使用的 hash info。hash info 包括以下三项:

  • 检索条件与索引匹配的列数
  • 第一个不匹配的列中,两者匹配的字节数
  • 匹配的方向是否从左往右进行

我们通过一个例子来简要介绍 hash info 中第一项。假设一张表 table1,其索引是(A1, A2)两列构成的索引:

  • 如果检索条件是(A1=1 and A2=1),那么此次检索使用了该索引的最左两列,hash info 就是(2,0,true)
  • 如果检索条件是(A1=1), 那么此次检索使用了该索引的最左一列,hash info 就是(1,0,true) 关卡 2 就是为了找出经常使用的 hash info,作为建立 AHI 的依据。

关卡 3:该索引树上的某个数据页要被经常使用如果我们为表中所有数据建立 AHI,那 AHI 就失去了缓存的意义:内存已不足以存放其身躯,必然要放到磁盘上,那么其成本显然已经不低于收益。回忆一下,AHI 是为了缩短 B+ 树的查询成本设计的,如果把自己再放到磁盘上,就得变成另一颗 B+ 树(B+ 树算法是处理磁盘查询的高效结构),如此循环往复,呜呼哀哉。

因此我们只能为表中经常被查询的部分数据建立 AHI。所以关卡 3 的任务就是找出哪些数据页是经常被使用的数据页。

修成正果:终于开始建立 AHI 终于可以开始建立 AHI 了, 我们举个例子说明如何建立 AHI。假设以上三个关卡的通关情况如下:

  • 表 table1 具有 4 列:A1,A2,A3,B1。具有两个索引 Idx1(A1,A2,A3) 和 Idx2(B1)
  • 关卡 1:选出的索引是 Idx1
  • 关卡 2:选出的 hash info 是 (2, 0, true) (很多查询命中了 Idx1 的最左两列)
  • 关卡 3:选出了某个数据页 P3,其中包含数据 (1,1,1,1) 和 (1,2,2,2) 等等 那么建立 AHI 的过程是:在内存中,为数据页 P3 中的每一行数据建立索引
  • 对于数据(1,1,1,1),根据 hash info,选取前两列建立 AHI 的一项:(1,1)的哈希值->P3
  • 对于数据(1,2,2,2),根据 hash info,选取前两列建立 AHI 的一项:(1,2)的哈希值->P3
  • 以此类推

普度众生:终于可以使用 AHI 我们终于可以 AHI 加速查询了,假设查询条件是 A1=1 and A2=2,其满足条件:

  • 命中了索引 Idx1
  • 索引 Idx1 上的 hash info 是(2, 0, true),查询条件(A1=1 and A2=2)根据 hash info 转成(1,2)的哈希值
  • 根据此哈希值在 AHI 中查询,可查询到数据页为 P3 从以上过程可以看出,如果命中了 AHI,就可以跳过图 2 中查询索引树的 4 个步骤,一次到位找到数据页,提升性能。

总结 我们回顾一下 MySQL 建立 AHI 的整个过程:

  • 随着数据量增大,索引树变得越来越高,查询数据页成本变大
  • MySQL 引入 AHI 作为查询数据页的缓存,想降低查询数据页的成本
  • AHI 的"自适应"想解决的问题是 缓存不能太大,也不能太小
  • AHI 建立的过程中,通过不断限制条件,只为经常使用的索引和经常使用的数据页建立缓存

运维建议 理解了 AHI 的建立过程,在运维过程中就更容易理解 AHI 的状态,我们简要盘点一下 AHI 的运维:

  • innodb_adaptive_hash_index_parts。凡是缓存都会涉及多个缓存消费者间的竞争。MySQL 通过设立多个 AHI 分区,每个分区使用独立的锁,来减少锁竞争。
  • SHOW ENGINE INNODB STATUS。其中有 AHI 的每个分区的使用率和 AHI 的命中率。如果你的业务 AHI 使用率过低,理解了 AHI 建立的原理后,就可以分析该业务为何不命中 AHI,来判断业务是否合理,是否需要改变访问模式或者将数据冷热隔离。也可以考虑关闭 AHI,减少 AHI 的维护成本。
  • 在低版本 MySQL 上使用 AHI,先查阅 MySQL bug 列表。低版本是存在一些与 AHI 相关的影响业务的缺陷,在新版本上均已修复,新版本 MySQL 可放心使用。
您可能感兴趣的文档:

--结束END--

本文标题: 图解MySQL | [原理解析] Adaptive Hash Index 是如何建立的

本文链接: https://lsjlt.com/news/4317.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 图解MySQL | [原理解析] Adaptive Hash Index 是如何建立的
    Adaptive Hash Index(以下简称 AHI)估计是 MySQL 的各大特性中,大家都知道名字但最说不清原理的一个特性。本期图解我们为大家解析一下 AHI 是如何构建的。 首先我们思考一下 AHI 是为了解决什么问题: 随着...
    99+
    2014-10-02
    图解MySQL | [原理解析] Adaptive Hash Index 是如何建立的
  • 图解MySQL | [原理解析] MySQL insert 语句的磁盘写入之旅
    一条 insert 语句在写入磁盘的过程中到底涉及了哪些文件?顺序又是如何的?下面我们用两张图和大家一起解析 insert 语句的磁盘写入之旅。 图 1:事务提交前的日志文件写入 旅途过程: 首先 insert 进入 server ...
    99+
    2016-05-10
    图解MySQL | [原理解析] MySQL insert 语句的磁盘写入之旅
  • 如何解析Vue3的响应式原理
    本篇文章给大家分享的是有关如何解析Vue3的响应式原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Vue2响应式原理回顾// 1.对象响应化:遍历每个key,定义g...
    99+
    2023-06-22
  • MySQL MVCC 原理分析:如何解决数据并发问题?
    MySQL MVCC 原理分析:如何解决数据并发问题?在数据库系统中,数据并发问题是一个非常重要且常见的挑战。在多个用户同时对数据库进行读写操作时,会出现数据不一致、丢失更新等问题。为了解决这些问题,MySQL引入了MVCC(多版本并发控制...
    99+
    2023-10-22
    MySQL mvcc 并发问题解决
  • 如何理解WEB开发中的图片分析
    本篇文章给大家分享的是有关如何理解WEB开发中的图片分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、缩小图片大小当图片很多的时候,减少图...
    99+
    2024-04-02
  • 如何解析Redis中的集群主从复制原理
    这篇文章将为大家详细讲解有关如何解析Redis中的集群主从复制原理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 本篇文章带大家...
    99+
    2024-04-02
  • 如何进行AfterCodecs for Mac破解版的原理分析
    这篇文章给大家介绍如何进行AfterCodecs for Mac破解版的原理分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。AfterCodecs for Mac是一款本地AE/PR/ME视频编码加速输出渲染插件,最...
    99+
    2023-06-02
  • MySQL MVCC 原理解析:为什么是并发控制的最佳选择?
    MySQL MVCC 原理解析:为什么是并发控制的最佳选择?在关系型数据库中,数据的一致性和并发控制是至关重要的。MySQL作为最流行的关系型数据库管理系统之一,采用了MVCC(Multi-Version Concurrency Contr...
    99+
    2023-10-22
    mvcc 并发控制 关键词:MySQL
  • 如何进行MySQL多版本并发控制MVCC底层原理解析
    本篇文章为大家展示了如何进行MySQL多版本并发控制MVCC底层原理解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1 事务并发中遇到的问题1.1 脏读当一个事务读取到了另外一个事务修改但未提交的...
    99+
    2023-06-22
  • 如何理解MySQL Authentication Failed的问题分析与解决方法
    今天就跟大家聊聊有关如何理解MySQL Authentication Failed的问题分析与解决方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。...
    99+
    2024-04-02
  • 如何解读MySQL的InnoDB引擎日志工作原理
    这篇文章主要介绍了如何解读MySQL的InnoDB引擎日志工作原理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。当你使用UPDATE, IN...
    99+
    2024-04-02
  • 教你如何深度解析Windows7的设备驱动管理原理
    1、Windows 7系统的设备驱动文件解读 在Windows7系统中包含了一个覆盖范围很广的身边驱动程序库。在该操作系统的基本安装中,这些驱动程序都会保存在驱动程序存储区中,它们位于%SystemRoot%\Syste...
    99+
    2023-05-25
    设备驱动 驱动管理 Windows7 设备 管理 驱动 深度
  • 如何进行JSONP跨域请求原理的深入解析
    这篇文章将为大家详细讲解有关如何进行JSONP跨域请求原理的深入解析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是同源策略同源策略,它是由Netscape提出的一个著名的安全策略。现在...
    99+
    2023-06-26
  • Oracle12c 中如何理解完全刷新的物化视图工作原理
    Oracle12c 中如何理解完全刷新的物化视图工作原理,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是物化视图?物化视图是用于复制数...
    99+
    2024-04-02
  • MySQL启动失败的原因是什么及如何解决
    本篇内容主要讲解“MySQL启动失败的原因是什么及如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL启动失败的原因是什么及如何解决”吧!此处我的电...
    99+
    2024-04-02
  • MySQL安装失败的原因是什么及如何解决
    这篇文章主要讲解了“MySQL安装失败的原因是什么及如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL安装失败的原因是什么及如何解决”吧!失败的原因如果你原先安装过MySQL,...
    99+
    2023-07-02
  • 如何解析C# Socket编程实现访问网络的原理
    这期内容当中小编将会给大家带来有关如何解析C# Socket编程实现访问网络的原理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在C# Socket编程学习中,我们知道MS为我们提供了System.Net...
    99+
    2023-06-17
  • utf8mb4的utf8mb4_0900_ai_ci如何理解?mysql新建库如何选择字符集?
    MySQL字符集详解_永远是少年啊的博客-CSDN博客_mysql 字符集今天继续给大家介绍MySQL相关知识,本文主要内容是MySQL字符集。一、MySQL字符集简介二、查看和设置MySQL字符集(一)查看当前字符集设置(二)更改默认字符...
    99+
    2023-09-04
    mysql 数据库
  • php连接mysql失败的原因是什么及如何解决
    这篇“php连接mysql失败的原因是什么及如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php连接mysql失败的...
    99+
    2023-07-05
  • 如何进行webpack中bundle.js运行单步调试的原理解析
    本篇文章为大家展示了如何进行webpack中bundle.js运行单步调试的原理解析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我这里可以在回顾一下这个web pack的hello world项目...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作