InnoDB到底支不支持哈希索引,为啥不同的人说的不一样?

继续回答水友提问(最近问MySQL的多):沈老师,我在网上看到不同的资料,有的说InnoDB支持哈希索引,有的说不支持,到底哪个是正确的呢?

对于InnoDB的哈希索引,确切的应该这么说:

(1)InnoDB用户无法手动创建哈希索引,这一层上说,InnoDB确实不支持哈希索引;

(2)InnoDB会自调优(self-tuning),如果判定建立自适应哈希索引(Adaptive Hash Index, AHI),能够提升查询效率,InnoDB自己会建立相关哈希索引,这一层上说,InnoDB又是支持哈希索引的;

那什么是自适应哈希索引(Adaptive Hash Index, AHI)呢?原理又是怎样的呢?咱们先从一个例子开始。

不妨设有InnoDB数据表:t(id PK, name KEY, sex, flag)

画外音:id是主键,name建了普通索引。

假设表中有四条记录:

1, shenjian, m, A

3, zhangsan, m, A

5, lisi, m, A

9, wangwu, f, B

如上图,通过前序知识,容易知道InnoDB在主键id上会建立聚集索引(Clustered Index),叶子存储记录本身,在name上会建立普通索引(Secondary Index),叶子存储主键值。

发起主键id查询时,能够通过聚集索引,直接定位到行记录。

select * from t where name=’ls’;

发起普通索引查询时:

(1)会先从普通索引查询出主键(上图右边);

(2)再由主键,从聚集索引上二次遍历定位到记录(上图左边)。

不管聚集索引还是普通索引,记录定位的寻路路径(Search Path)都很长。

在MySQL运行的过程中,如果InnoDB发现,有很多SQL存在这类很长的寻路,并且有很多SQL会命中相同的页面(page),InnoDB会在自己的内存缓冲区(Buffer)里,开辟一块区域,建立自适应哈希所有AHI,以加速查询。

从这个层面上来说,InnoDB的自使用哈希索引,更像“索引的索引”,毕竟其目的是为了加速索引寻路。

既然是哈希,key是什么,value是什么?

key是索引键值(或者键值前缀)。value是索引记录页面位置。

为啥叫“自适应(adaptive)”哈希索引?

系统自己判断“应该可以加速查询”而建立的,不需要用户手动建立,故称“自适应”。

系统会不会判断失误,是不是一定能加速?

不是一定能加速,有时候会误判。当业务场景为下面几种情况时:

  • 很多单行记录查询(例如passport,用户中心等业务)
  • 索引范围查询(此时AHI可以快速定位首行记录)
  • 所有记录内存能放得下

AHI往往是有效的。
画外音:任何脱离业务的技术方案,都是耍流氓。当业务有大量like或者join,AHI的维护反而可能成为负担,降低系统效率,此时可以手动关闭AHI功能。
一个小知识点,希望解答了这位水友的疑问。
知其然,知其所以然

Image placeholder
未设置
  68人点赞

没有讨论,发表一下自己的看法吧

推荐文章
为什么我使用了索引,查询还是慢?

经常有同学问我,我的一个SQL语句使用了索引,为什么还是会进入到慢查询之中呢?今天我们就从这个问题开始来聊一聊索引和慢查询。另外插入一个题外话,个人认为团队要合理的使用ORM,可以参考 ORM的权衡和

opcode 操作数 5 中不同的类型

zend_op_array.opcodes指向指令列表,具体每条指令的结构如下: struct_zend_op{//*opline*opcodes constvoid*handler;//指令执行ha

DBA跳槽应该去大公司还是小公司?99%的人这样说…

职场生涯总会面临着选择,尤其对我们这些IT人来说,跳槽的频率应该是所有行业中相当大的了。那么我们跳来跳去,究竟该选择什么样的公司?大or小。 工作三年多了,经历一大一小,最近也面试了不少家公司,形态各

InnoDB一棵B+树可以存放多少行数据?

一个问题?InnoDB一棵B+树可以存放多少行数据?这个问题的简单回答是:约2千万。为什么是这么多呢?因为这是可以算出来的,要搞清楚这个问题,我们先从InnoDB索引数据结构、数据组织方式说起。我们都

详解layui模块化与非模块化的不同引用方式

layui模块化与非模块化的不同引用方式:1、模块化与非模块化的区别layui中有许多不同的内置模块,如弹出层、日期与时间选择器、分页等不同模块。模块化:使用时加载相应的模块。非模块化:一次性加载所有

不一样的css,sass(scss)的基本使用

前言此文主要记录sass的scss语法的基本使用。sass是css的预编译器,它扩展一些css所没有的变量的定义、条件控制、循环、自定义方法等。基础内容1.变量/*scss*/ //声明变量 $pri

编程书说的 “Go 程序员应该让聚合类型的零值也具有意义” 是在讲什么

在《Go语言编程》这本书和很多其他Go编程教程中很多都提到过“Go程序员应该让一些聚合类型的零值也具有意义”的概念,我们这篇文章主要说一下有意义的零值这个话题。 在Go中声明变量时如果初始化表达式被省

当中小企业决定上云,真的像你们说的那么简单吗?

题图:fromZoommy四季度历来是一年中最忙碌的时期,辛苦了一年,各项工作都在收官,千头万绪、环环相扣,再加上绩效考核的开展,不但烧脑,而且还烧心。同时,最后一个季度又肩负着为来年开局而打基础的艰

Hyperf 发布 Session、极简 DB、zk 配置中心组件和支持 Twig/Plates 视图引擎支持

更新内容 本周更新主要新增极简DB组件,Zookeeper配置中心,和Session组件,以及为视图组件增加了Twig和Plates视图引擎的支持,同时为计划任务组件增加了集群执行的支持。极简DB组件

邮件不支持css怎么办?

邮件不支持css怎么办?邮件是支持css的,但是需要使用内联样式,内部样式和外部样式无法使用。下面是一些在邮件中使用css的注意事项:1.邮件使用table+css布局2.邮件主要部分在body内部,

jquery不支持ie8?

jquery不支持ie8?2.0以上版本的jQuery已经不再支持IE8及以下版本的IE浏览器,使用jquery1.9版本即可。解决方法: 相关问题:Jquery从2.x版本开始已经不再进行IE低版本

jquery ie8不支持怎么办?

IE8不支持jQuery版本解决办法可以使用原生JS或者低版本的Jquery1.x版本,通过判断IE浏览器的版本来加载对应版本的jQuery。使用语句可在IE8模式下进行一些兼容操作。代码如下: 这样

qq浏览器不支持css3怎么办?

qq浏览器不支持css3怎么办?css3属性,比如keyframe和animation都需要加webkit、ms前缀,针对手机不同浏览器可能还要加更多前缀。以此达到适配所以浏览器的目的。解决qq浏览器

ie8不支持jquery怎么解决?

IE8不支持jQuery版本解决办法让IE8及以下版本浏览器引用原生JS或者低版本的Jquery1.x版本。我们可任意通过判断IE浏览器的版本来加载对应版本的jQuery。使用语句可在IE8模式下进行

Node.js 到底是什么?

Node.js是一个JavaScript的运行环境,听起来很棒,然而是什么意思呢?它又是怎么使用的呢? Node运行环境涵盖所有你运行用JavaScript编写的项目所需要的东西。如果你知道Java的

一致性哈希算法 PHP 实现

一致性哈希算法(consistenthashing)PHP实现本文转载于 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hotspo

Talos网卡负载优化:基于个性化一致性哈希的负载均衡

本文将详细介绍基于个性化一致性哈希的流量均衡方法。 目录  业务增长带来的流量均衡需求基于一致性哈希的调度策略个性化一致性哈希的负载均衡流量均衡在Talos中的实现前文《小米消息队列的实践》介绍了小米

学习 nodejs+mongodb+koa2 写接口(一) 环境布置

一.环境准备最近在学用Nodejs写后端接口,了解到koa2是Nodejs的一个框架。可以快速开发后端接口,同时也能更快熟悉Nodejs以下是所需的环境node  v7.6+,可以用nvm或者n安装指

学习 nodejs+mongodb+koa2 写接口(二) koa2教程入门

一.hellokoa安装koa2#初始化package.json npminit #安装koa2 npminstallkoahelloworld代码constKoa=require('koa') c

贫民窟的人工智能

大数据文摘出品编译:Jiaxu、小七、夏雅薇26岁的单身母亲Brenda住在非洲最大的贫民窟基贝拉,这也是全球最贫困的社区之一。每天早上,Brenda从家离开,乘坐公共汽车前往内罗毕东部,和她的100

美漂数据科学家年薪多少?爬了6年H1B签证数据发现,招的人多了,但钱少了

大数据文摘出品来源:medium编译:张睿毅、曹培信自2012年起,一直被称为“最性感的工作”的数据科学家职位,吸引了大批远渡重洋到达硅谷,做着“数据梦”的留学生们。但他们也付出了不菲的前期投入,除了

丰巢刷脸取件被小学生破解,号称3D、深度学习加持的人脸识别究竟靠谱吗?

大数据文摘出品作者:曹培信经费不够,2D来凑?前些天,丰巢智能快递柜被“小学生”用打印照片破解,让人大跌眼镜。据《人民日报》报道,嘉兴上外秀洲外国语学校402班科学小队向都市快报《好奇实验室》报料:他

DBA职业发展之路:去“IOE”等挑战之下,DBA将何去何从?

开篇随着近些年来,开源、自动化、云化的兴起,DBA职业也正悄然发生一些变化。经常有朋友咨询我,职业发展规划;特别是近期Oracle的大幅裁员之后,针对DBA这一职业未来该如何发展?本文是个人对此问题的

我的代码和注释都写的像坨屎,那又怎么样?

题图:摄于2019年–绍兴东湖一周前,我的朋友圈被一篇#百度某新员工发飙:前人代码写得像一坨屎,颠覆了对大厂的认知#的文章刷屏了,评论区也非常热闹。但让我惊讶的是,几乎所有的声音里都充满着嘲笑与讥讽,

《双子杀手》票房扑街又怎样?李安开创的“AI易容术”,甩那些磨皮换脸大片几条街

大数据文摘出品作者:刘俊寰上映快小半个月了,李安导演的《双子杀手》大家都看了吗?这是李安继《少年派的奇幻漂流》(2012)和《比利林恩的中场战事》(2016)之后,再次推出的好莱坞电影工业的革新之作。