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

时间:2016-01-14 21:59:17

标签: database indexing rdbms database-indexes

我一直在网上搜索数据库索引的类型,但我还没有找到真正的答案。大多数页面都说有两种类型(Clustered和Non-Clustered),但有些人说不同的术语如(Simple,composite,B-tree,Bitmap,unique,non-unique,FBI,Dense,Sparse,Reverse ,. ..等)。

我知道它在DBMS之间有所不同,但为什么大多数源只有两种类型(Clustered和Non-Clustered)? SQL支持哪些类型的索引?

有人可以给我更多解释吗?

2 个答案:

答案 0 :(得分:3)

这不是一个简单的回复。我试着在一些段落中解释这个主题,我将谈论SQL Server,作为一个RDBMS ..

当我们谈论群集/非群集(hobt - >堆或b-tree)时,我们会指示"结构&# 34;其中存储了对象(表或索引视图)。事实上,很简单" list"物品,没有任何特定订单存储; 群集是"组织"树中的行数据(称为b+tree)按索引键排序,它们对象本身(表可以是堆或集群结构); nonclustered 与群集结构类似,但它们不代表表(也不是索引视图)。它们是指向聚集或堆底层对象的附加结构。

<强>小结

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

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

  • 简单/复合实现:聚簇或非聚簇,只是带有键的索引,它是单个列键或一组列。
  • 唯一索引:聚簇或非聚簇,每行只支持一个值(在索引的键上)。它与一个&#34;唯一约束相关&#34;或&#34;主键约束&#34;这保证了价值的独特性。 unique和pk之间的区别在于pk不接受NULL值。
  • 覆盖索引:只是非聚簇,因为聚簇结构中有记录。它是一个包含一组列的索引(INCLUDE子句)(请记住,它是一棵树)。它被称为覆盖索引,因为它是一个覆盖某个查询的索引,而无需查找底层对象。
  • 过滤索引:只是非群集,因为您无法过滤掉存储为群集结构的表的一部分。它是一个带有WHERE子句的索引,它只考虑底层对象的一部分。条件必须是确定性的(例如,您不能使用WHERE StartDate&gt; = GETDATE())。

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

  • 计算列的索引
  • 空间索引
  • XML索引
  • 全文索引
  • 列存储索引(从2012年开始)
  • 内存优化索引(从2014年开始)

最后,您还可以获得一组有关索引的概念,这些概念不是索引类型,但您可以听到它们:

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

希望这有帮助。

答案 1 :(得分:0)

取决于您对索引类型的含义。每个索引都必须是聚簇的或非聚簇的,并且只能对表中的一个索引进行聚类。但是,有一些特殊类型的索引具有其他属性,例如唯一或索引中有多个字段(复合索引)等。