【问题标题】:TSQL indexes on search fields, should I include Id搜索字段上的 SQL 索引,我应该包括 Id
【发布时间】:2012-04-04 15:59:03
【问题描述】:

假设我有一个典型的客户表;

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

【问题讨论】:

  • 你会搜索什么?始终使用完整的名字/姓氏或单独或...?
  • 嗯,这实际上更像是一个通用问题。将主键字段放在表的任何其他索引上是否有任何好处?
  • 一般不,@MichaelFredrickson 的回答几乎涵盖了它。
  • 感谢您的意见约阿希姆

标签: tsql database-indexes


【解决方案1】:

ID 添加到您的其他索引是没有意义的。如果您有大量具有相同 firstName lastName 组合的行,并且您已经知道 ID...

但是,如果您已经知道要搜索的记录的 ID,则可以只使用聚集索引进行搜索。

此外,每个非聚集索引都已经包含聚集索引的值,以便在使用非聚集索引找到行后,它可以使用聚集索引查找行。 You wouldn't have to include ID in your non-clustered index if you wanted to make it a covering index for the fields (FirstName, LastName, Id)

最后请注意,如果您使用 FirstNameLastName 创建单个索引,则该索引将仅用于包含索引前沿 FirstName 的搜索。如果您打算仅使用 LastNameFirstName 执行搜索,请创建两个索引,每列一个。

【讨论】:

  • 谢谢迈克尔,非聚集索引指向聚集索引的事实回答了我的问题。如果可以的话,我只想稍微扩展一下这个问题。如果主键是唯一标识符,出于性能原因,我会将其设为非集群。那么,您是否仍建议将 ID 从后续索引中删除?
  • 我仍然不会将ID 作为索引的一部分,如果您需要INCLUDE ID 以使索引覆盖,那么这可能是合理的.. 但我' m 假设这种情况可能不太可能发生,因此您可能不需要包含 ID。但是,我建议不要将您的 PK 设为唯一标识符,因为 you'll still experience a lot of fragmentation even when using a non-clustered index with a GUID
  • 感谢 Michael,我无法在一个项目中选择 UniqueIdentifier。我至少确实将它们上的聚集索引转换为非聚集索引!
猜你喜欢
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 2011-10-10
  • 2010-09-18
  • 1970-01-01
  • 2016-06-08
  • 2012-06-22
相关资源
最近更新 更多