我已经有点知道这个问题的答案了,但是我总是觉得好像我还需要进一步探讨这个话题。
我的基本理解是,一般而言,仅包含您可能在任何给定时间查询/排序的所有字段的单个索引可能不太有用,但是我已经看到了这种类型的东西。就像这样,有人想:“好吧,如果我们将所有这些东西都放在一个索引中,数据库就可以使用它来查找所需的东西”,而从未见过针对某些实际查询运行的执行计划。
想象一个这样的表:
id int pk/uid
name varchar(50)
customerId int (foreign key)
dateCreated datetime
我可能会看到包含name
,customerId
和dateCreated
字段的单个索引。
但是我的理解是,这样的索引不会在查询中使用,例如:
SELECT [id], [name], [customerId], [dateCreated]
FROM Representatives WHERE customerId=1
ORDER BY dateCreated
对于这样的查询,在我看来,一个更好的主意是使用包括customerId
and dateCreated
字段的索引,该customerId
字段为“ first”。这将创建一个索引,该索引将以某种方式组织数据,以使该查询可以快速找到所需内容(按所需顺序)。
我看到的另一件事,也许与第一件事一样频繁,是每个字段上的单独索引。所以,每一个上name
,customerId
和dateCreated
领域。
与第一个示例不同,在我看来,这种安排有时至少部分有用。查询的执行计划可能表明,至少它是使用上的索引customerId
来选择记录,但没有使用带有dateCreated
字段的索引来对记录进行排序。
我知道这是一个广泛的问题,因为对任何特定表集上的任何特定查询的特定答案通常是查看执行计划说的将要执行的操作,否则将表和查询的详细信息纳入其中帐户。另外,我知道这取决于查询的运行频率,而不是为其维护特定索引的开销。
但是我想我要问的是作为索引的一般“起点”,为特定的,经常被拉的查询以及WHERE或ORDER BY子句中的字段具有特定索引的想法是否有意义?