MySQL原理--Hash索引和B+树索引的区别

原文网址:MySQL原理--Hash索引和B+树索引的区别-CSDN博客

简介

本文介绍MySQLHash索引和B+树索引的区别。

原理对比

Hash索引

Hash索引的结构和HashMap相类似,键值 key 通过 Hash 映射找到桶 bucket。

InnoDB中key的位置采用除法散列函数(取余法),冲突机制采用链接法。

B+ 树索引

B+ 树是一种自平衡的树数据结构,它保持数据有序。每一次查询都是从根节点开始,沿着树结构逐级向下查找,直到找到叶子节点。所有叶子节点都位于同一层,且按关键字顺序排列,这有助于支持范围查询。

Hash索引优缺点

优点

  1. 检索速度快:哈希索引在理想情况下能够以 O(1) 的时间复杂度进行数据检索,因为哈希函数的计算和数组下标的访问都非常高效。
  2. 实现简单:哈希表的数据结构比较简单,实现和维护都相对容易。
  3. 插入和删除高效:插入和删除操作也能在 O(1) 的时间复杂度内完成(假设冲突不严重)。

缺点

  1. 不支持范围查询:哈希函数是无序的,哈希索引不能有效支持范围查询。例如,查找键值在某一范围内的所有记录将会非常低效。
  2. 不支持模糊查询
  3. 冲突处理复杂:当哈希冲突频繁发生时,必须采用冲突解决策略,如链地址法、开放地址法等,这会增加额外的时间和空间开销。
  4. 动态扩展复杂:当哈希表的负载因子(Load Factor)过高时,需要重新哈希(Rehash),这是一项开销较大的操作。

B+树索引优缺点

优点

  1. 支持范围查询:由于叶子节点按顺序排列并通过链表连接,B+树可以高效地进行范围查询。
  2. 支持模糊查询:比如LIKE
  3. 平衡性:B+树保持平衡,每个节点的子节点数在一个固定范围内,这保证了树的高度较低,从而检索、插入和删除操作的时间复杂度都为 O(log n)。
  4. 磁盘友好:B+树节点较大,可以充分利用磁盘块,提高磁盘I/O效率。叶子节点的链表结构也有助于顺序访问,提高磁盘访问效率。

缺点

  1. 插入和删除复杂:相较于哈希索引,B+树在插入和删除时需要维护树的平衡性,涉及节点的分裂和合并,操作较为复杂。
  2. 空间开销大:B+树的节点需要存储多个键值和子节点指针,空间开销相对较大。

如何选型?

B+树索引

大多数场景下,都会有组合查询,范围查询、排序、分组、模糊查询等查询特征,Hash 索引无法满足要求,建议使用B+树索引。

Hash索引

在离散型高,数据基数大,且等值查询时候,Hash索引有优势。

注意

在MySQL中,只有HEAP/MEMORY/NDB引擎表才能显式支持哈希索引。

InnoDB引擎支持自适应哈希索引(adaptive hash index),不能在创建索引时指定,它的原理是:当某个索引值使用非常频繁的时候,它会在B+ 树索引的基础上再创建一个Hash索引,就是让B+树也具备了Hash索引的优点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT利刃出鞘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值