2020B站晚会-10-13:hash与B+tree的区别

在MySQL 数据库中Hash 型索引与B-Tree 型索引有什么区别呢?

MySQL 支持Hash 索引和B-Tree 索引但两者究竟有什么区别呢?这个问题可能会困扰许多用户下面对两者的区别进行详细分析。

MySQL Hash 索引结构具囿一定特殊性其检索效率非常高,索引的检索可以一次定位不像B-Tree 索引需要从根节点到枝节点,通过多次I/O 访问最后才能访问到页节点,所以Hash 索引的查询效率要远高于B-Tree 索引

但是Hash 索引的效率要比B-Tree 高很多,为什么在实际应用中不能都应用Hash 索引而还要使用B-Tree 索引呢任何事物都昰有两面性的,Hash 索引也一样虽然Hash 索引效率高,但是Hash 索引由于本身的特殊性也带来了很多限制和弊端主要有以下几个方面:

由于MySQL Hash 索引比較的是进行Hash 运算之后的Hash 值,所以它只能用于等值的过滤不能用于基于范围的过滤,因为经过相应的Hash 算法处理之后的Hash 值的大小关系并不能保证和Hash 运算前完全一样。

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

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

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

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

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

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

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

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

我要回帖

更多关于 ps2020 的文章

 

随机推荐