文中执行环境为 MySql 5.7.31

InnoDB不直接支持常规的哈希索引

1
2
3
4
5
6
7
8
9
10
11
12
CREATE DATABASE test;
use test;
CREATE TABLE student (
id int,
name varchar(255),
address varchar(255),
city varchar(255)
);

CREATE INDEX idx_name_hash ON student (name) USING HASH;

SHOW INDEX FROM student;

运行结果:

Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
student 1 idx_name_hash 1 name A 0 NULL NULL YES BTREE

MySQL 的 InnoDB 存储引擎不直接支持常规的哈希索引,而是使用 B+Tree 索引作为默认索引数据结构。创建索引时使用了 USING HASH,但实际上 MySQL 会将其视为默认的 B-tree 索引类型。因此,即使您使用 USING HASH,查询 SHOW INDEX 结果中的 Index_type 仍然会显示为 BTREE。

然而,InnoDB存储引擎确实引入了一种特殊的功能称为“自适应哈希索引”(Adaptive Hash Index),它用于提高热点数据的访问性能。

自适应哈希索引是一种在内存中维护的数据结构,用于加速常见的查询操作。当InnoDB发现某些数据页被频繁地访问时,它会将这些页的一部分数据构建成一个哈希索引,以便更快地定位和访问这些热点数据。这个自适应哈希索引是在内存中动态构建和维护的,可以提高一些查询的性能,特别是对于具有明显的热点数据访问模式的数据库。自适应哈希索引是一项内置的功能,无法手动指定。