作为一个理论数据库问题,如果有人问你“你会建议哪些索引以及为什么?”答案是来自primary
、clustering
和secondary
索引吗?我们如何知道是否应该引入其中一个而不是B-Tree
?
这应该是从一个简单的索引角度出发,因为我问的是与索引相关的课程材料,其中我已经涵盖了一些介绍性材料。
答案1
primary
和指标与和指标secondary
正交,并且这两个都与和指标正交。b-tree
hash
clustered
non-clustered
第一类索引是逻辑索引。它们是有关数据结构的高级指标。主键应唯一地标识您的数据,这意味着它应该是关系数据库理论所称的“候选键”之一。次级索引用于加快对主索引以外的其他字段的查询,它们不必是候选键。
第二类是特定的索引实现,适用于略有不同的查询。
b-tree
可以满足范围查询(WHERE c > 3 AND c < 7
),但hash
不能。hash
然而,在精确查询()的平均情况下为 O(1)(常数时间)WHERE c = 5
,而b-tree
始终为 O(lg n)(对数时间)。b-tree
和hash
都是定义明确的数据结构,但它们与您的实际数据关系不大。第三类定义整个表是否排序在磁盘上按索引的排序顺序。如果是这样,它就称为索引
clustered
。
如您所见,索引可以是这三个不同类别中的一个primary clustered b-tree
或primary clustered hash
另一个或其他组合。
如果有人问你要引入哪些索引,答案首先会来自第一类。问题可能与模式有关。这至少是你的起点。只有当你决定要引入哪些索引时,你才需要考虑它们应该是 B 树、聚类等等。第一类是逻辑类,与你使用数据的方式紧密相关。其他的是实现细节。