美文网首页
为何数据库不常用Hash索引

为何数据库不常用Hash索引

作者: 兮兮码字的地方 | 来源:发表于2020-06-07 18:28 被阅读0次

Hash 本身是一个函数,又被称为散列函数,它可以帮助我们大幅提升检索数据的效率,这是因为 Hash 只需要一步就可以找到对应的取值,算法复杂度为 O(1),数组检索数据的算法复杂度为 O(n)(需要依次遍历并做比较才能找到目标数据)。

Hash 算法是通过某种确定性的算法(比如 MD5、SHA1、SHA2、SHA3)将输入转变为输出。相同的输入永远可以得到相同的输出,假设输入内容有微小偏差,在输出中通常会有不同的结果。如果想要验证两个文件是否相同,便不需要把两份文件直接拿来比对,只需要对两次的Hash 函数计算结果进行比较,就可以知道这两个文件是否相同。

采用 Hash 进行检索效率非常高,基本上一次检索就可以找到数据,而 B+ 树需要自顶向下依次查找,多次访问节点才能找到数据,中间需要多次 I/O 操作,从效率来说 Hash 比 B+ 树更快。

那为什么B+树更多的用来作为数据库的索引呢?

Hash 索引不能进行范围查询,而 B+ 树可以。这是因为 Hash 索引指向的数据是无序的,而 B+ 树的叶子节点是个有序的链表。
Hash 索引不支持联合索引的最左侧原则(即联合索引的部分索引无法使用),而 B+ 树可以。对于联合索引来说,Hash 索引在计算 Hash 值的时候是将索引键合并后再一起计算 Hash 值,所以不会针对每个索引单独计算 Hash 值。因此如果用到联合索引的一个或者几个索引时,联合索引无法被利用。
Hash 索引不支持 ORDER BY 排序,因为 Hash 索引指向的数据是无序的,因此无法起到排序优化的作用,而 B+ 树索引数据是有序的,可以起到对该字段 ORDER BY 排序优化的作用。
也无法用 Hash 索引进行模糊查询,而 B+ 树使用 LIKE 进行模糊查询的时候,LIKE 后模糊查询的话就可以起到优化作用。
对于等值查询来说,通常 Hash 索引的效率更高,但是,索引列的重复值如果很多,效率就会降低。这是因为遇到 Hash 冲突时,需要遍历桶中的行指针来进行比较,找到查询的关键字,非常耗时。所以,Hash 索引通常不会用到重复值多的列上,比如列为性别、年龄的情况等。

可见,Hash 索引存在着很多限制,相比之下在数据库中 B+ 树索引的使用面会更广,不过也有一些场景采用 Hash 索引效率更高,比如在键值型(Key-Value)数据库中,Redis 存储的核心就是 Hash 表。

另外 MySQL 中的 Memory 存储引擎支持 Hash 存储,如果需要用到查询的临时表时,就可以选择 Memory 存储引擎,把某个字段设置为 Hash 索引,比如字符串类型的字段,进行 Hash 计算之后长度可以缩短到几个字节。当字段的重复度低,而且经常需要进行等值查询的时候,采用 Hash 索引是个不错的选择。

MySQL 的 InnoDB 存储引擎还有个“自适应 Hash 索引”的功能,就是当某个索引值使用非常频繁的时候,它会在 B+ 树索引的基础上再创建一个 Hash 索引,这样让 B+ 树也具备了 Hash 索引的优点。

所以说,Hash索性和B+树索性他们有着各自的使用场景,传统的关系型数据库确实更适合采用后者,但有时还可以把他们结合一起使用来发挥各自最大的优势。

相关文章

  • 哈希索引

    概述 数据库中经常用到的索引包括hash索引和B树索引。 定义 哈希索引(hash index)是基于hash表实...

  • 为何数据库不常用Hash索引

    Hash 本身是一个函数,又被称为散列函数,它可以帮助我们大幅提升检索数据的效率,这是因为 Hash 只需要一步就...

  • 索引概述

    索引是数据库查询提高性能的最常用的工具。可以把索引类比成书的目录。索引类型:hash索引和btree索引。MyIS...

  • InnoDB存储引擎学习总结 第五章 索引

    常用命令 一 InnoDB存储引擎索引概述 InnoDB 支持 B+树索引、hash索引、全文索引,其中hash索...

  • 谈谈数据库索引

    数据库索引是一种辅助数据结构,它能加快数据提取速度。常见索引: Hash索引 B-tree索引 Hash索引 例如...

  • 索引(五)索引数据结构

    数据库索引,是数据库管理系统中一个排序的数据结构,主要有B树索引、Hash索引两种 一:B树索引 先来看下B树索引...

  • mysql-索引

    mysql-索引 按数据结构分类 B树索引-NOSQL使用较多 B+树索引 hash索引-KV数据库上比较常见 位...

  • 数据库索引

    存储方式: MySQL 中常用的索引在物理上分为 B-树索引和 HASH 索引两类。 逻辑区分: 普通索引,唯一...

  • MySQL面试题 | 附答案解析(四)

    7. 索引算法有哪些? 索引算法有 BTree算法和Hash算法 BTree算法 BTree是最常用的mysql数...

  • 二、b-tree索引和hash索引

    索引类型 b-tree索引和hash索引 1.hash索引(存在内存中) 在memory表默认是hash索引的理论...

网友评论

      本文标题:为何数据库不常用Hash索引

      本文链接:https://www.haomeiwen.com/subject/bjzctktx.html