搜索字段上的TSQL索引,是否应包含Id
假设我有一个典型的客户表搜索字段上的TSQL索引,是否应包含Id,tsql,database-indexes,Tsql,Database Indexes,假设我有一个典型的客户表 Id Int Identity Primary Key, FirstName varchar(255), LastName varchar(255), Phone VarChar(30) 所以主键在Id上创建一个聚集的唯一索引 为了加快搜索速度,我想在名称字段中添加索引 我的问题是,我是应该将Id添加到这些索引中,还是这些索引将自己绑定到主键上 比如, Create Index IX_Customer_FirstLastName On Customers(Fir
Id Int Identity Primary Key,
FirstName varchar(255),
LastName varchar(255),
Phone VarChar(30)
所以主键在Id上创建一个聚集的唯一索引
为了加快搜索速度,我想在名称字段中添加索引
我的问题是,我是应该将Id添加到这些索引中,还是这些索引将自己绑定到主键上
比如,
Create Index IX_Customer_FirstLastName On Customers(FirstName, LastName, Id)
。。。那是不是太过分了
以下方法是否更有效
Create Index IX_Customer_FirstLastName On Customers(FirstName, LastName)
TIA将
ID
添加到其他索引中是没有意义的。只有当您有大量行具有相同的firstName
lastName
组合,并且您已经知道ID
时,这才有帮助
但是,如果您已经知道要搜索的记录的ID
,则可以使用聚集索引进行搜索
此外,每个非聚集索引已经包含聚集索引的值,以便在使用非聚集索引找到行后,可以使用聚集索引查找该行
最后请注意,如果使用
FirstName
和LastName
创建单个索引,则此索引将仅用于包含索引前缘的FirstName
的搜索。如果您计划仅使用LastName
或FirstName
执行搜索,请创建两个索引,每列一个。您将搜索什么?始终使用全名/姓氏,或者单独使用,或者…?其实这更像是一个普通问题。将主键字段放在表上的任何其他索引上有什么好处吗?通常没有,来自@MichaelFredrickson的答案几乎涵盖了这一点。感谢您的输入JoachimThanks Michael,非聚集索引指向聚集索引的事实回答了我的问题。如果可以的话,我只想稍微扩展一下这个问题。如果主键是唯一标识符,出于性能原因,我会将其设置为非集群。那么,您是否仍然建议将ID从后续索引中删除?我仍然不会将ID
作为索引的一部分,如果您需要更改ID以使索引覆盖,那么这是合理的。。但我假设这种情况可能不太可能发生,并且您可能不需要出于这个原因包含ID。但是,我建议不要让你的PK成为唯一标识符,因为。谢谢Michael,在一个项目中选择唯一标识符是我无法控制的。我至少把它们的聚集索引转换成了非聚集索引!