Hash索引与B-Tree索引

场景:

现在需要往内存里插入1K万条数据,我如果需要查询某俩个时间段中间的数据,怎么查...?


解决方案:

      1、把  1K万条数据 放在hashmap中, 时间片段作为key,这样是最为简单的方式,但是这样做只能遍历出key来作对比,非常不科学。

         2、时间片段 以有序的某种形式存在 某个结构中,而且必须能有序的,hash没范围因为是散列的,然后根据数据结构的所说,树型结构的查找和 插入速度都不错,时间片存在树上,然后数据不一定存在树上,拿到时间范围后 再与某个 hash对应上取相应数据。

 

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运算前完全一样。

(2)Hash 索引无法被用来避免数据的排序操作。

由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;

(3)Hash 索引不能利用部分索引键查询。

对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。

(4)Hash 索引在任何时候都不能避免表扫描。

前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。

(5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。


问题汇总:

   1、有没有一种数据结构是支持范围检索的呢?

                  答:有序结构都支持范围查找,包括最基本数组链表 都支持到范围查找,一般范围的2个步骤排序和查找。

   2、排序?  不是数据插入的时候就应该要排好序插入吗?

     答:对于凌乱的数据我们是需要排序的,插入时候排好是因为我们选择了数据结构,我告诉你的是 对于一堆数据 如果我们要 做范围查找..2个步骤排序和查找。

     3、怎么排序?
  答:你可以选择某种数据结构加算法, 你说的插入已经排好序其实也是选择了数据结构和算法。像list sort是java直接实现了排序算法,java给你封装了很多 结构和算法,但不是全部。

      4、 关于查询和排序是不是二分查找最快速?

  答:查询的话 2分法肯定快呀 但是2分法前题是排序..对于java jdk 二分法都封装好了,所以说java中接触不到很多数据结构和算法。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值