Hash索引

Hash索引、位图索引介绍

有些数据库的存储引擎还支持Hash这个数据结构来作为其索引。Hash结构想必大家已经非常熟悉了,这是根据Hash函数的运算,只需一次定位,便能找到需要查询数据所在的头。不像B+索引先从根节点再到非叶子节点再到叶子节点这样才能访问到我们的数据,这样呢可能会经过多次的IO访问,所以呢Hash索引的效率理论上要高于B+树索引
在这里插入图片描述

如图所示,比如说我们要查找 叫 Sandra Dee 的这么一个人,那么根据Hash函数对key Sandra Dee 的运算只需一次我们便能定位到 152 号头,就是152号buckets之后呢便将152号的entries 全部加载到内存当中。那么该entries是一个链表我们顺着 John Smith 的指针定位到定位到了Sandra Dee。可能有些人就有疑问了,既然Hash索引的查询效率要比B+树要高,为什么我们不用Hash 索引来作为主流索引呢?任何事物都是有两面性的,Hash索引也一样。虽然Hash索引的查询效率高,但是Hash索引本身由于其的特殊性呢,也带来了很多的限制与弊端。

下面列举一下它的缺点:

  • 仅仅能满足 “=”,“IN” 不能使用范围查询(那么由于Hash索引是进行Hash运算之后的Hash值,所以他只能进行等值的过滤,不能用于基于范围的查询,因为经过相应Hash算法处理之后的Hash值的大小关系呢,并不能保证和Hash运算前的一样。如刚才的John Smith 和 Sandra Dee 就取了相等的Hash 值,所以呢并不代表它的实际的大小)
  • 无法被用来避免数据的排序操作 (还是上一个原因,由于Hash索引中存放的是经过Hash运算之后的值,而且Hash值的大小关系并不一定和经过Hash运算前的键值完全一样,所以数据库无法利用索引的数据来进行排序运算)
  • 不能利用部分索引键来查询 (对于组合索引呢,Hash索引在计算Hash值的时候是组合键也就是将组合索引键,合并之后再一起进行运算的Hash的值,而不是单独计算Hash值的,所以呢通过组合索引的前面一个或几个索引键进行查询的时候Hash索引也无法被利用,而B+树是支持利用组合索引中的部分索引的)
  • 不能避免表扫描(前面已经了解到,Hash索引是将索引键通过Hash运算之后,将运算结果的Hash值和对应的盘指针信息,存放到一个bucket当中的,由于不同的索引键存在相同的Hash值,所以取出某个满足Hash键值的数据了,也无法从Hash索引中完成查询,还是要通过访问bucket中的实际数据进行相应的比较)
  • 遇到大量Hash值相等的情况后性能不一定就会比B-tree索引高(对于选择性比较低的索引键如果创建Hash索引,那么将会大量记录,指针存放进行存放在同一个bucket的情况,从而造成整体性能非常低下,就跟我们之前用到的二叉树一样,有可能会变成线性的存储结构,有可能在一个很极端的情况下所有的键计算出来的Hash值是相同的,也就是存放在一个bucket当中那么我们查找bucket的最后一条数据,就会变成线性的了,所以这也是Hash索引不能成为主流索引的原因,因为它比较的不稳定,也不支持一些范围的查询)

位图索引

一般数据库使用B+Tree ,Hash 作为其索引以外还有没有别的数据结构呢?答案是肯定的。就是咋们的BitMap即位图索引,当表中的某个字段持有几种值之后,就比如男女中两种性别的时候,如果仅仅是为了在一件事件上进行高效的统计,此时使用位图索引是一个最佳的选择了,不过大家要注意的是目前很少的数据库支持位图索引,以至比较主流的Oracle数据库,哪位图索引的数据结构类似于B+树 。如下图:

在这里插入图片描述

B+树呢就用来定位叶子节点。这些节点包含指定键值的位主段,位主段就是位于叶子节点上,它的段信息 就是

<Blue,10.0.3,12.8.3, 1000100100010010100> ,,,

该索引不是主流索引,这里仅做简单的讲解,由于数据的值种类的固定的像这里他只有

Blue , Green , Red,Yellow 这几种形态,所以在存储方式上他先按照状态值进行分开,然后每种值的中间会按照存储每个实际的数据行是否是这个值我们可以看到这里有 010101 这样的一个位图。比如说Blue 的位图 1000100100010010100 第一个它是Blue我们就用1来表示,第二行不是Blue就用0来表示,它是Red那么Red的第二个就是1 那么这种情况下由于只用存放是与否,所以通常只用一个bit位来存放,因此理论上一个叶子上可以存放许多的bit位来表示不同的行,因此用它来统计时是非常快的加载到内存中后几乎是纯CPU的跌加操作,那位图索引固然好,但它只是用于某个字段的值只有固定的几个这种情况。同时需要位图索引有一个很大的缺陷就是他的锁的力度非常的大,当尝试新增或者修改一条数据的时候,通常与它在一个位图的数据操作都会被锁住,因为某行所在的位置顺序有可能因为数据的添加和删除而发生改变 比如说Blue 的位图 1000100100010010100 中01的顺序呢和行的顺序是一一对应的,那如果发生增删改查的时候它的逻辑顺序可能会发生变化,因此要发生改变的时候必须将其锁定,以防止取错数据。所以它并不适合高并发的联机事物处理系统。而适用于并发较少且统计量较多的系统。

物处理系统。而适用于并发较少且统计量较多的系统。

索引我们现在可以来回答索引的数据结构这个问题了,通常索引的数据结构是一个B+树,比较少众的也有Hash结构,还有BitMap等。

MySQL中的哈希索引是一种特殊类型的索引,它能够提供非常高的检索效率。与B-Tree索引相比,哈希索引可以直接一次定位到数据,而不需要从根节点到叶子节点多次IO访问。这使得哈希索引在查询方面具有更高的性能。 在MySQL中,可以通过创建自定义哈希索引来模拟哈希索引的功能。这种方法是在B-Tree索引的基础上创建一个伪哈希索引。虽然实际上还是使用B-Tree进行查找,但是使用哈希值而不是键本身进行索引查找。 为了使用哈希索引,你可以手动指定使用哈希函数,在查询的WHERE子句中使用哈希函数来搜索。这样可以避免存储大量的URL,并且能够使用较小的索引来进行超长键的索引。例如,通过在URL列上进行哈希,可以使用CRC32哈希函数来创建一个url_crc列作为索引,然后在查询时使用哈希函数来搜索。 总之,MySQL的哈希索引具有高效的检索性能,并且可以通过创建自定义哈希索引来模拟哈希索引的功能。这种方法可以提高查询效率,特别是对于需要存储大量URL并根据URL进行搜索的情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MySQL索引算法——哈希算法](https://blog.csdn.net/qq_41618510/article/details/83317969)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [MySQL Hash索引和B-Tree索引的区别](https://download.csdn.net/download/weixin_38611230/13691152)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值