MySQL原理--Hash索引和B+树索引的区别
原文网址:MySQL原理--Hash索引和B+树索引的区别-CSDN博客
简介
本文介绍MySQLHash索引和B+树索引的区别。
原理对比
Hash索引
Hash索引的结构和HashMap相类似,键值 key 通过 Hash 映射找到桶 bucket。
InnoDB中key的位置采用除法散列函数(取余法),冲突机制采用链接法。
B+ 树索引
B+ 树是一种自平衡的树数据结构,它保持数据有序。每一次查询都是从根节点开始,沿着树结构逐级向下查找,直到找到叶子节点。所有叶子节点都位于同一层,且按关键字顺序排列,这有助于支持范围查询。
Hash索引优缺点
优点
- 检索速度快:哈希索引在理想情况下能够以 O(1) 的时间复杂度进行数据检索,因为哈希函数的计算和数组下标的访问都非常高效。
- 实现简单:哈希表的数据结构比较简单,实现和维护都相对容易。
- 插入和删除高效:插入和删除操作也能在 O(1) 的时间复杂度内完成(假设冲突不严重)。
缺点
- 不支持范围查询:哈希函数是无序的,哈希索引不能有效支持范围查询。例如,查找键值在某一范围内的所有记录将会非常低效。
- 不支持模糊查询
- 冲突处理复杂:当哈希冲突频繁发生时,必须采用冲突解决策略,如链地址法、开放地址法等,这会增加额外的时间和空间开销。
- 动态扩展复杂:当哈希表的负载因子(Load Factor)过高时,需要重新哈希(Rehash),这是一项开销较大的操作。
B+树索引优缺点
优点
- 支持范围查询:由于叶子节点按顺序排列并通过链表连接,B+树可以高效地进行范围查询。
- 支持模糊查询:比如LIKE
- 平衡性:B+树保持平衡,每个节点的子节点数在一个固定范围内,这保证了树的高度较低,从而检索、插入和删除操作的时间复杂度都为 O(log n)。
- 磁盘友好:B+树节点较大,可以充分利用磁盘块,提高磁盘I/O效率。叶子节点的链表结构也有助于顺序访问,提高磁盘访问效率。
缺点
- 插入和删除复杂:相较于哈希索引,B+树在插入和删除时需要维护树的平衡性,涉及节点的分裂和合并,操作较为复杂。
- 空间开销大:B+树的节点需要存储多个键值和子节点指针,空间开销相对较大。
如何选型?
B+树索引
大多数场景下,都会有组合查询,范围查询、排序、分组、模糊查询等查询特征,Hash 索引无法满足要求,建议使用B+树索引。
Hash索引
在离散型高,数据基数大,且等值查询时候,Hash索引有优势。
注意
在MySQL中,只有HEAP/MEMORY/NDB引擎表才能显式支持哈希索引。
InnoDB引擎支持自适应哈希索引(adaptive hash index),不能在创建索引时指定,它的原理是:当某个索引值使用非常频繁的时候,它会在B+ 树索引的基础上再创建一个Hash索引,就是让B+树也具备了Hash索引的优点。