数据库中Btree索引与Hash索引的区别

看数据库时,突然有个疑问,在MySQL中默认使用的索引方式是Btree方式,联系到数据结构中的B-树,想要了解一下Btree索引方式与Hash索引方式各有什么优缺点。以下内容为自己学习时的记录,仅供参考。
对于B-树,他到底有哪些特性以及创建操作等一些方法,因为涉及的内容比较多,建议学习一下数据结构再做讨论,在这里只略讲一二,B-树,顾名思义,是一棵树的形状,包括了根、枝、页,一颗m阶B-树,或为空树,或为满足下列特性的m叉树:
(1)树中每个结点最多有m颗子树
(2)若根节点不是空节点(或根节点不是叶结点),子树个数2~m
(3)除根节点和外节点之外的每个结点,子树个数[m/2](向上取整)~m
(4)除外结点之外的每个结点中都包含下列信息数据:(n,A0,K1,A1,K2,A2,…,Kn,An),n为结点中关键码的个数,Ki为关键码,i=1,2…,n,且Ki<K(i+1),i=1,2,…,n-1。

下面是一棵B-树的插入操作
一棵B-树的插入操作
下面讲一下查找方式或者说原理

  1. B-树的查找
    B-树的查找很简单,是二叉排序树的扩展,二叉排序树是二路查找,B-树是多路查找,因为B-树结点内的关键字是有序的,在结点内进行查找时除了顺序查找外,还可以用折半查找来提升效率。B-树的具体查找步骤如下(假设查找的关键字为key):
    1)先让key与根结点中的关键字比较,如果key等于k[i](k[]为结点内的关键字数组),则查找成功
    2)若key<k[1],则到p[0]所指示的子树中进行继续查找(p[]为结点内的指针数组),这里要注意B-树中每个结点的内部结构。
    3)若key>k[n],则道p[n]所指示的子树中继续查找。
    4)若k[i]<key<k[i+1],则沿着指针p[I]所指示的子树继续查找。
    5)如果最后遇到空指针,则证明查找不成功。
  2. Hash表查找
    哈希表查找又叫散列表查找,通过查找关键字不需要比较就可以获得需要记录的存储位置,它是通过在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。即: —存储位置=f(关键字),其中f为哈希函数。

由于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 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。
综上所述,即使Hash索引有效率高这样的优势,但由于其局限性较多,所以还是BTree索引更受欢迎。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值