使用标识列或搜索列上的索引加速SQL查询?

时间:2016-11-23 22:40:40

标签: sql-server indexing

当我提取我的桌子时,我得到了这个。该表有一个cache: false auto_reload: true 列,它是一个标识列(autoinc)。

然后仍然是可读的客户编号,理论上是唯一的,但到目前为止,该表并未强制执行。

我的客户正在搜索客户编号而不是ID。

我现在的问题是:我是否仍应在ID列添加索引(如果是群集/非群集?)以提高搜索速度?

CUSTERMERNUMBER

3 个答案:

答案 0 :(得分:3)

如果ID字段在其他表中被引用为外键,则将其保留为聚簇索引,并在CUSTOMERNUMBER上创建非聚集索引。

考虑不是只是CUSTOMERNUMBER上创建索引,而是继续进行并在其上创建Unique Constraint(带有索引)。这将阻止要求违反唯一CUSTOMERNUMBER的业务规则,并向数据库提供可用于提高操作效率的其他信息。

一如既往,先测试一下:

Alter Table Customer Add Constraint uCUSTOMERNUMBER Unique (CUSTOMERNUMBER);

(唯一约束的缺点是它创建的唯一索引不能include其他列。如果包含是必需的,那么唯一的非聚集索引是一个选项。)

答案 1 :(得分:1)

创建一个关于客户编号的唯一/非聚集索引是一个好主意。但是我们应该小心,不要创建太多索引,特别是如果表格很大且发生了大量DML。

答案 2 :(得分:1)

如果在表上进行的大多数搜索都是在“客户编号”上进行的,则可能是个好主意。您还可以在创建索引之前创建多个测试查询,并在创建索引后再次在索引上运行查询,以查看索引是否确实提高了性能。

在决定是否使索引成为聚簇索引或非聚簇索引时,应确定是否已经有聚簇索引(因为它们是在主键上自动创建的),以及是否可以将此新索引更好地用作主索引键。如果是这样,您可能必须创建一些约束,因此客户编号必须唯一以保证搜索的正确性。

如果您有兴趣了解有关索引的更多信息,请随时查看我写的这篇文章: https://dataschool.com/learn/how-indexing-works