加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

InnoDB到底支不支持哈希索引,为啥差异的人说的纷歧样?

发布时间:2019-10-11 22:20:47 所属栏目:编程 来源:58沈剑
导读:继承答复水友提问(最近问MySQL的多): 沈先生,我在网上看到差异的资料,有的说InnoDB支持哈希索引,有的说不支持,到底哪个是正确的呢? 对付InnoDB的哈希索引,确切的应该这么说: InnoDB用户无法手动建设哈希索引,这一层上说,InnoDB确实不支持哈希索引

继承答复水友提问(最近问MySQL的多):

沈先生,我在网上看到差异的资料,有的说InnoDB支持哈希索引,有的说不支持,到底哪个是正确的呢?

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

  • InnoDB用户无法手动建设哈希索引,这一层上说,InnoDB确实不支持哈希索引;
  • 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到底支不支持哈希索引,为啥差异的人说的纷歧样?

如上图,通过前序常识,轻易知道InnoDB在主键id上会成立聚积索引(Clustered Index),叶子存储记录自己,在name上会成立平凡索引(Secondary Index),叶子存储主键值。

提倡主键id查询时,可以或许通过聚积索引,直接定位到行记录。

InnoDB到底支不支持哈希索引,为啥差异的人说的纷歧样?

  1. select * from t where name='ls'; 

提倡平凡索引查询时:

  • 会先从平凡索引查询出主键(上图右边);
  • 再由主键,从聚积索引上二次遍历定位到记录(上图左边)。

不管聚积索引照旧平凡索引,记录定位的寻路路径(Search Path)都很长。

在MySQL运行的进程中,假如InnoDB发明,有许多SQL存在这类很长的寻路,而且有许多SQL会掷中沟通的页面(page),InnoDB会在本身的内存缓冲区(Buffer)里,开发一块地区,成立自顺应哈希全部AHI,以加快查询。

InnoDB到底支不支持哈希索引,为啥差异的人说的纷歧样?

从这个层面上来说,InnoDB的自行使哈希索引,更像“索引的索引”,事实其目标是为了加快索引寻路。

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

  • key是索引键值(可能键值前缀)。
  • value是索引记录页面位置。

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

体系本身判定“应该可以加快查询”而成立的,不必要用户手动成立,故称“自顺应”。

体系会不会判定失误,是不是必然能加快?

不是必然能加快,偶然辰会误判。 当营业场景为下面几种环境时:

  • 许多单行记录查询(譬喻passport,用户中心等营业)
  • 索引范畴查询(此时AHI可以快速定位首行记录)
  • 全部记录内存能放得下

AHI每每是有用的。

画外音:任何离开营业的技能方案,都是耍混混。

当营业有大量like可能join,AHI的维护反而也许成为承担,低落体系服从,此时可以手动封锁AHI成果。

一个小常识点,但愿解答了这位水友的疑问。

知其然,知其以是然。

【本文为51CTO专栏作者“58沈剑”原创稿件,转载请接洽原作者】

InnoDB到底支不支持哈希索引,为啥差异的人说的纷歧样?

戳这里,看该作者更多好文

【编辑保举】

  1. MySQL:硬盘在24 * 7事变中停工了,我该怎么办?
  2. 两个小器材,MySQL死锁说明,新手艺又Get!
  3. 为什么MySQL索引要用B+树,而不是B树?
【责任编辑:赵宁宁 TEL:(010)68476606】
点赞 0

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读