其实严谨来说,这个问法是不准确的。我想可能要问的是 MySQL数据库的InnoDB引擎支持哈希索引吗?在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式不同。在MySQL中,只有HEAP/MEMORY引擎表才能显式支持哈希索引,但这个是内存引擎,平时用的不多,这里主要讲InnODB引擎对哈希索引的支持。
MySQL是插件式的存储引擎架构,支持多种不同类型的引擎,从5.5.5版本之后,InnoDB为默认存储引擎。如下为MySQL基本的逻辑架构图。

这里先说结论,lnnoDB引擎支持哈希索引,只是叫自适应哈希索引【AHI:Adaptive Hash Index】。它有自己的一些特殊之处:
•数据库管理员无法显示创建哈希索引
•InnoDB引擎根据内部访问情况,判定创建哈希索引会提高索引的访问效率,才会自动创建哈希索引
•哈希索引是基于内存缓冲池中的经常访问的索引页构建,速度很快
•默认开启,可以动态关闭【关闭:set global innodb_adaptive_hash_index=0】

关于AHI官方文档的描述
哈希索引可以直接查找任意数据并将其索引值转换为一系列的指针从而提升查询速度。InnoDB有一个监控索引使用的机制,如果评估建立哈希索引可以提升查询效率,那么就会自动创建。但是每种业务情况不同,并不是所有创建的自适应哈希索引会有效,只能通过启用或者禁用来查看系统运行指标来评判。
哈希索引基于表上的一个现有的B-tree索引来创建【可以说是”索引的索引“】,InnoDB可以用认为合适长度B-tree键的前缀建索引,另外这个索引可以是针对局部数据,仅覆盖那些经常被访问的索引页。
说明:如果监控到许多线程正在等待一个在btr0sea.c中创建的RW-latch,说明自适应索引的内存锁竞争过于激烈,可以通过禁用自适应哈希索引来缓解。

喜欢就点一下 “在看” 吧




