数据库索引的实际类型是什么?

What are the actual types of database indexes?

我一直在网上搜索数据库索引的类型,但没有找到真正的答案。大多数页面说有两种类型(集群和非集群),但其他一些页面说不同的术语,如(简单、复合、B 树、位图、唯一、非唯一、FBI、密集、稀疏、反向、. ..等)。

我知道 DBMS 之间的区别,但为什么大多数源只有两种类型(集群和非集群)? SQL 支持哪些类型的索引?

谁能给我更多解释?

取决于您所说的索引类型是什么意思。每个索引都必须是聚集的或非聚集的,并且 table 中只有一个索引可以聚集。然而,有些特殊类型的索引还具有其他属性,例如唯一性或在索引中具有多个字段(复合索引)等。

这不是简单的回复。我尝试在某些段落中解释该主题,我将谈论 SQL 服务器,作为 RDBMS..

当我们谈论 Clustered/Nonclustered(hobt --> 堆或 b-tree)时,我们'表示 "structures" 对象(table 或索引视图)存储在其中。实际上, 是简单的 "list" 项目,存储时没有任何特定顺序; clustered 是 "organize" 行数据 在树中的结构(称为 b+tree)按索引键和 它们是对象本身(table可以是堆或集群结构); nonclustered 类似于集群结构,但它们不代表 tables(也不代表索引视图)。它们是指向集群或堆底层对象的附加结构。

回顾

table(或索引视图)可以存储在堆中或集群中(SQL 服务器可以只有一个集群结构)。 table(或索引视图)可以具有多个附加结构作为非聚集索引,以便具有多种访问数据。每个非聚集索引将指向堆或聚集底层对象,具体取决于数据的组织方式(这取决于您是否创建了聚集)

也就是说,我们可以说非堆结构可以支持各种索引:

  • simple/composite 实现:集群或非集群,仅使用一个键进行索引,该键是单个列键或一组列。
  • 唯一索引:聚集或非聚集,它只支持每行一个值(在索引的键上)。它与保证值唯一性的 "unique constraint" 或 "primary key constraint" 有关。 unique 和 pk 的区别在于 pk 不接受 NULL 值。
  • 覆盖索引:只是非聚簇的,因为聚簇结构里面有记录。它是一个索引,在叶(记住,它是一棵树)中包含一组列(INCLUDE 子句)。之所以称为覆盖索引,是因为它是覆盖某个查询的索引,而不查找底层对象。
  • 过滤索引:只是非聚集索引,因为你不能过滤掉存储为聚集结构的table部分。它是一个带有 WHERE 子句的索引,它只考虑底层对象的一部分。条件必须是确定性的(例如,您不能使用 WHERE StartDate >= GETDATE())。

上面的索引是最常用的(根据我的经验),但我们还可以添加:

  • 计算列上的索引
  • 空间索引
  • XML 索引
  • Full-text 索引
  • 列存储索引(从 2012 年开始)
  • 内存优化索引(从 2014 年开始)

最后你也可以有一套关于索引的概念,它不是索引的类型,但你可以听到它们:

  • 重叠索引
  • 重复索引
  • 缺少索引
  • 未使用的索引

希望对您有所帮助。