MySQL索引类型对比:Hash与B-Tree的差异解析,技术要点分享

文章导读
MySQL 索引中,B-Tree(通常是 B+Tree)与 Hash 索引的核心差异在于数据结构与适用场景。B-Tree 索引基于平衡树结构,支持范围查询、排序及模糊匹配,适用于大多数通用场景,尤其是 InnoDB 引擎默认采用。Hash 索引基于哈希表,仅支持等值查询,查询速度理论更快(O(1)),但不支持范围查询和排序,且存在哈希冲突风险,主要用于 Memory 引擎或特定等值查找场景。选择时
📋 目录
  1. 【MySQL 索引】Hash 索引与 B-Tree 索引 介绍及区别
  2. MySQL 数据库——索引 (2)-B+Tree、Hash 结构,索引分类 (聚集索引、二级索引)-阿里云开发者社区
  3. MySQL 调优系列——MySQL B+Tree 索引和 Hash 索引的区别?
  4. FAQ
A A

MySQL 索引中,B-Tree(通常是 B+Tree)与 Hash 索引的核心差异在于数据结构与适用场景。B-Tree 索引基于平衡树结构,支持范围查询、排序及模糊匹配,适用于大多数通用场景,尤其是 InnoDB 引擎默认采用。Hash 索引基于哈希表,仅支持等值查询,查询速度理论更快(O(1)),但不支持范围查询和排序,且存在哈希冲突风险,主要用于 Memory 引擎或特定等值查找场景。选择时需根据查询类型决定:范围选 B-Tree,精确匹配且高并发可考虑 Hash。

【MySQL 索引】Hash 索引与 B-Tree 索引 介绍及区别

Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像 B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的 IO 访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。(1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和 Hash 运算前完全一样。

MySQL 数据库——索引 (2)-B+Tree、Hash 结构,索引分类 (聚集索引、二级索引)-阿里云开发者社区

最终我们发现,B+Tree 与 B-Tree 相比,主要有以下三点区别:所有的数据都会出现在叶子节点;叶子节点形成一个单向链表。非叶子节点仅仅起到索引数据的作用,具体的数据都是在叶子节点存放的。上述我们所看到的结构是标准的 B+Tree 的数据结构,接下来,我们再来看看 MySQL 中优化之后的 B+Tree。MySQL 索引数据结构对经典的 B+Tree 进行了优化。在原 B+Tree 的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的 B+Tree,提高区间访问的性能,利于排序。Hash MySQL 中除了支持 B+Tree 索引,还支持一种索引类型---Hash 索引。结构 哈希索引就是采用一定的 hash 算法,将键值换算成新的 hash 值,映射到对应的槽位上,然后存储在 hash 表中。

MySQL索引类型对比:Hash与B-Tree的差异解析,技术要点分享

MySQL 调优系列——MySQL B+Tree 索引和 Hash 索引的区别?

1、B+Tree 首先是有序结构,为了不至于树的高度太高,影响查找效率,在叶子节点上存储的不是单个数据,提高了查找效率;为了更好的支持范围查询,B+ 树在叶子节点冗余了非叶子节点数据,为了支持翻页,叶子节点之间通过指针相连;2、B+ 树算法:通过继承了 B 树的特征,通过非叶子节点查询叶子节点获取对应的 value,所有相邻的叶子节点包含非叶子节点,使用链表进行结合,有一定顺序排序,从而范围查询效率非常高。缺点:因为有冗余节点数据,会比较占内存。2、Hash 索引'1、Hash 是 k,v 形式,通过一个散列函数,能够根据 key 快速找到 value 2、哈希索引就是采用一定的 hash 算法,把键值换成新的哈希值,检索时不需要类似 B+ 树那样从根节点到叶子节点逐级查找,只需要一次 hash 算法即可立即定位到相应的位置,速度非常快。缺点:因为底层数据结构是散列的,无法进行比较大小,不能进行范围查找。

FAQ

Hash 索引为什么不支持范围查询?

MySQL索引类型对比:Hash与B-Tree的差异解析,技术要点分享

因为 Hash 索引存储的是经过哈希计算后的值,哈希值的大小关系与原键值的大小关系不一致,无法利用索引进行范围过滤。

MySQL索引类型对比:Hash与B-Tree的差异解析,技术要点分享

InnoDB 引擎默认使用哪种索引?

InnoDB 存储引擎默认使用 B-Tree(实际上是 B+Tree)索引,不支持手动创建 Hash 索引,但有自适应哈希功能。