hash索引与B+树索引的适用场景,为什么用B+树索引

hash索引与B+树索引的适用场景,为什么用B+树索引

1. 什么是索引,索引的作用又是什么呢

什么是索引?

索引是存储引擎用于提高数据库表访问速度的一种数据结构。就拿InnoDB来说吧,InnoDB中索引结构有两种,一种是hash索引,一种是B-Tree索引。

索引的作用是什么呢?

数据是存储在磁盘上的,每次查询都要访问磁盘,而访问磁盘需要浪费时间,没有索引的情况下,你就没有了头绪,不知道从哪下手,就只能依次进行查询,访问磁盘次数较多,浪费时间,有了索引就不一样了,就拿B+树来说,一般树的高度也就2-4层,你不管访问哪个数据差不多只要访问4次,这样相比之下,有索引会节省大量的时间。

2.Hash索引

什么是Hsah索引呢 ?
讲起hash,我们可能应该不太陌生,它和hashMap结构很像,键值 key 通过 Hash 映射找到桶 bucket

innoDB是通过取余法找到bucket位置的,解决hsah冲突的方法是链接法

hash索引效率如何呢 ?

hash索引的效率很高,通过key计算的出来的hash值在不考虑冲突的情况下,检索一次就找到要查询的内容了,既然hash索引效率那么高,B+树好像就没有用处了,毕竟B+树还需要一层一层的向下访问,属实是浪费时间了。
说到这里,是不是感觉没毛病,但我们都知道innoDB的默认索引是什么,B+树索引,是不是感觉官方有点憨憨,为什么不用hash索引作为默认,其实hash索引快是快,但有很多不足,不然官方也不会默认B+树索引。
hash索引的应用场景和不足?

  1. hash索引的应用场景

如果存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,特别适合采用哈希索引

  1. hash索引的不足
  • hash索引不支持范围查询,这是为什么呢 ?
    是因为Hash操作并不能保证顺序性,所以值相近的两个数据,Hash值相差很远,被分到不同的桶中。

  • hash 索引无法做 like ‘xxx%’ 这样的部分模糊查询,这是为什么呢?
    因为需要对 完整 key 做 Hash 计算,定位bucket,而模糊查询的时候,key不完整,无法用key定位到对应的桶找到对应的hash值。

  • hsah索引无法进行排序,这是为什么呢?
    通过key计算出来的hash值,Hash值的大小关系并不一定和Hash运算前的键值完全一样。

  • hash索引不支持多联合索引,这是为什么呢?
    多联合索引是根据最左匹配原则进行,而hash索引会将多列合并算出hash值,从而导致联合索引无法被利用。

  • hash索引存在hash碰撞,当重复的键过多的时候就会效率大大降低,不稳定

  • hash索引不是我们自己控制的,而是由数据库自身创建并使用,我们不能够对他进行干预

现在来看还感觉hash索引比较好吗,它是比较快但是它的局限性太多。接下来让我们看看B+树强大的功能

B+树索引

什么是B+树?

B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。

B+树索引就是将加索引的列按照B+树的结构进行排列,每次查找的时候通过二分法,一层一层的判断,最终找到叶子节点,叶子结点存放的是key和value

B+树索引相对于hash的优点

  • B+tree索引的叶子节点形成有序链表,便于范围查询
  • B+tree 索引的叶子节点形成有序链表,可用于排序。
  • B+tree 索引具有最左前缀匹配,可以进行部分模糊查询。比如(xxx%)但是这种就不会走索引(%xxx)
  • 相对稳定,hash索引会产生hash碰撞,不稳定
    看到这里我们就理解为什么我们最常用的是B+树索引而不是hash索引

B+树的应用场景?

大多数场景下,都会有组合查询,范围查询、排序、分组、模糊查询等查询特征,Hash 索引无法满足要求,我们就需要B+树索引进行操作。

对于hash索引和B+树索引,他们都有各自的应用场景,最好的就是两者相结合
为什么两者可以相结合呢?
innoDB里有个“自适应 Hash 索引”的功能,就是当某个索引值使用非常频繁的时候,它会在 B+ 树索引的基础上再创建一个 Hash 索引,这样让 B+ 树也具备了 Hash 索引的优点。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值