散列和索引有什么区别?

我研究过 DBMS 索引(稀疏、密集、基于辅助键的索引等)和 DBMS 中的散列(可扩展、线性),但我仍然不了解两者之间的区别。

这两种方法是结合使用还是分别使用?我很困惑,因为这两种方式似乎都是为了让我们快速获取数据,因此我认为一种方式就足够了。

任何人都可以澄清区别吗?

我的理解散列是索引的一种。

索引的目的主要是为了让我们加快对数据库的检索。

在一般的开发中,如果数据库查询缓慢,通常的人一般都会看下有没有建索引,或者索引有没有建立正确。

以 MySQL 为例子,MySQL 使用的是 B+ 数的索引,这个是总所周知的内容了。

如果我们觉得 B+ 树的索引不好用的话,我们可以使用另外一种索引,比如说 Hash 索引。

这里有一篇文章是介绍了 2 两种索引。

https://dev.mysql.com/doc/refman/5.6/en/index-btree-hash.html

区别

所以我的理解就是索引是一种定义,可以有多种实现方式。

散列就是其中一种实现方式,但是散列有些问题,所以在实际上使用的并不多。

  1. 哈希索引只保存哈希码和指针,而不存储字段值,所以不能使用索引中的值来避免读取行。不过访问内存中的行速度非常快(因为是MEMORY引擎),所以对性能影响并不大
  2. 哈希索引数据并不是按照索引值顺序存储的,所以无法用于排序
  3. 哈希索引不支持部分索引列查找,因为哈希索引始终是使用索引列的全部内容来计算哈希码。
  4. 如,在数据列(A,B)上建立哈希索引,如果查询只有数据列A,则无法使用该哈希索引
  5. 哈希索引只支持等值比较查询,包括=、IN()、<=>,不支持范围查询,如where price > 100
  6. 哈希冲突(不同索引列会用相同的哈希码)会影响查询速度,此时需遍历索引中的行指针,逐行进行比较。

哈希冲突听过吧。

从下面的表格上来看,我们知道我们最常用的 InnoDB 数据库存储引擎是不支持 Hash 索引的。