继续回答水友的问题(最近很多关于MySQL的问题):沉老师,在网上看到了不同的资料,有的说InnoDB支持hash索引,有的说不支持。哪一个是正确的?对于InnoDB的哈希索引,准确地说应该是:InnoDB用户不能手动创建哈希索引。在这个级别,InnoDB不支持哈希索引;InnoDB会自我调整(self-tuning),如果确定建立自适应哈希索引(AHI)可以提高查询效率。InnoDB会建立相关的哈希索引。在这个层面上,InnoDB支持哈希索引;什么是自适应哈希索引?(自适应哈希索引,AHI)?原理是什么?让我们从一个例子开始。不妨建一个InnoDB数据表:t(idPK,nameKEY,sex,flag)画外音:id是主键,name建立了公共索引。假设表中有4条记录:1,shenjian,m,A3,zhangsan,m,A5,lisi,m,A9,wangwu,f,B如上图所示,通过前序知识,很容易知道InnoDB是在主键id上建立聚集索引(ClusteredIndex),叶子会存储记录本身。名称上会建立二级索引(SecondaryIndex),叶子会存放主键值。在发起主键id查询时,可以通过聚簇索引直接定位到行记录。select*fromtwherename='ls';启动通用索引查询时:主键会从通用索引中查询(上图右侧);然后会从聚簇索引遍历两次主键来定位记录(上图左侧)。不管是聚簇索引还是普通索引,记录定位的路径(SearchPath)都很长。在MySQL运行过程中,如果InnoDB发现有很多SQL有这么长的寻路,而且很多SQL会打到同一个页面(page),InnoDB会在自己的内存缓冲区(Buffer)中开辟。对于一个区域,建立所有AHI的自适应哈希来加速查询。从这个层面上看,InnoDB自用的哈希索引更像是“索引的索引”,毕竟它的目的是为了加快索引寻路。既然是hash,那什么是key,什么是value呢?键是索引键值(或键值前缀)。值是索引记录页的位置。为什么叫“自适应”哈希索引呢?系统判断“应该可以加快查询速度”,建立起来。不需要用户手动建立,所以称为“自适应”。系统会不会判断失误,就一定能提速?不一定能提速,有时会误判。当业务场景如下:许多单行记录查询(如护照、用户中心等)索引范围查询(此时AHI可以快速定位到第一行记录)如果所有记录都可以,AHI往往是有效的适合记忆。画外音:凡是没生意的技术方案都是耍流氓。当业务中存在大量点赞或加入时,AHI维护可能成为负担,降低系统效率。此时可以手动关闭AHI功能。一点知识点,希望能解答这位水友的问题。知其然,知其所以然。【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此阅读更多该作者好文
