【问题标题】:What are the actual types of database indexes?数据库索引的实际类型是什么?
【发布时间】:2016-04-20 10:15:25
【问题描述】:
我一直在网上搜索数据库索引的类型,但没有找到真正的答案。大多数页面都说有两种类型(集群和非集群),但其他一些则说不同的术语,例如(简单、复合、B-树、位图、唯一、非唯一、FBI、密集、稀疏、反向、. ..等)。
我知道 DBMS 之间的区别,但为什么大多数来源只有两种类型(集群和非集群)? SQL 支持哪些类型的索引?
谁能给我更多的解释?
【问题讨论】:
标签:
database
indexing
rdbms
database-indexes
【解决方案1】:
取决于索引类型的含义。每个索引都必须是聚集的或非聚集的,并且表中只有一个索引可以聚集。但是,也有一些特殊类型的索引具有其他属性,例如唯一性或索引中有多个字段(复合索引)等。
【解决方案2】:
这不是一个简单的回复。我尝试在某个段落中解释该主题,然后我将谈论 SQL Server,作为 RDBMS。
当我们谈论 集群/非集群 和 堆(hobt --> 堆或 b-tree)时,我们指的是对象(表或索引视图)被存储。实际上,堆是简单的项目“列表”,没有任何特定顺序存储; clustered 是在树(称为b+tree)中“组织”行数据的结构,按索引键排序,它们是对象本身(表可以是堆或集群结构); nonclustered 类似于集群结构,但它们不代表表(也不代表索引视图)。它们是指向集群或堆底层对象的附加结构。
回顾
表(或索引视图)可以存储在堆中或集群中(SQL Server 可以只有一个集群结构)。
一个表(或索引视图)可以具有多个附加结构作为非聚集索引,以便具有多种访问数据。每个非聚集索引都将指向堆或聚集的底层对象,具体取决于数据的组织方式(这取决于您是否创建了聚集)
也就是说,我们可以说非堆结构可以支持各种索引:
- 简单/复合实现:集群或非集群,只需使用一个键进行索引,该键是单个列键或一组列。
- 唯一索引:聚簇或非聚簇,每行仅支持一个值(在索引的键上)。它与保证值的唯一性的“唯一约束”或“主键约束”有关。 unique 和 pk 的区别在于 pk 不接受 NULL 值。
- 覆盖索引:只是非聚集的,因为聚集的结构里面有记录。它是一个在叶子中包含一组列(INCLUDE 子句)的索引(记住,它是一棵树)。之所以称为覆盖索引,是因为它是一个覆盖某个查询的索引,而不需要查找底层对象。
- 过滤索引:只是非聚集索引,因为您无法过滤掉存储为聚集结构的表的一部分。它是一个带有 WHERE 子句的索引,它只考虑底层对象的一部分。条件必须是确定性的(例如,您不能使用 WHERE StartDate >= GETDATE())。
上面的索引是最常用的(根据我的经验),但我们也可以添加:
- 计算列上的索引
- 空间索引
- XML 索引
- 全文索引
- 列存储索引(从 2012 年开始)
- 内存优化索引(从 2014 年开始)
最后你还可以有一组关于索引的概念,它们不是索引的类型,但你可以听到它们:
希望这会有所帮助。