SQL主键和索引
假设我在数据库集中有一个ID行(int)作为主键。 如果我经常查询ID,我还需要索引它? 还是它是一个主键意味着它已经被索引?
我想问的原因是因为在MS SQL Server中,我可以在这个ID上创build索引,正如我所说的那样是我的主键。
编辑:一个额外的问题 – 它会做任何伤害额外索引主键?
你说得对,SQL Server允许你在同一个字段上创build重复的索引是令人困惑的。 但是你可以创build另一个事实并不意味着PK索引也不存在。
额外的索引不好,但唯一的损害(非常小)是额外的文件大小和行创build开销。
正如其他人已经说过的,主键是自动索引的。
在主键列上创build更多索引只有在需要优化使用主键和其他特定列的查询时才有意义。 通过在主键列上创build另一个索引并包含其他一些列,您可以达到所需的查询优化。
例如,您有一个包含许多列的表,但您只查询ID,名称和地址列。 以ID为主键,我们可以创build以下build立在ID上的索引,但包括Name和Address列。
CREATE NONCLUSTERED INDEX MyIndex ON MyTable(ID) INCLUDE (Name, Address)
所以,当你使用这个查询:
SELECT ID, Name, Address FROM MyTable WHERE ID > 1000
SQL Server将只使用你创build的索引给你结果,它不会从实际的表中读取任何东西。
注意:这个答案可以解决企业级的开发问题 。
这是一个RDBMS问题,不仅仅是SQL Server,而且行为可能会非常有趣。 首先,主键被自动(唯一)索引是很常见的,但这并不是绝对的。 有时候,主键不是唯一索引的。
在大多数RDBMS中, 如果一个主键不存在 ,将自动创build一个唯一的索引。 因此,可以在将主键列声明为主键之前在主键列上创build自己的索引,然后在应用主键声明时,该索引将被数据库引擎使用(如果可以的话)。 通常,您可以创build主键并允许创build其默认唯一索引,然后在该列上创build自己的备用索引,然后删除默认索引。
现在有趣的部分 – 你不想要一个唯一的主键索引? 当你的表获得足够的数据(行)来维护索引太昂贵的时候,你不需要一个,也不能容忍它。 这取决于硬件,RDBMS引擎,表格和数据库的特性以及系统负载。 然而,一旦桌子达到几百万行,它通常开始显现。
关键的问题是,每行插入或主键列更新导致索引扫描,以确保唯一性。 这种独特的索引扫描(或其在任何RDBMS中的等价物)随着表的增长而变得更加昂贵,直到它支配表的性能。
我已经多次处理这个问题,这些表格有20亿行,8TB的存储量,每天有4千万行插入。 我负责重新devise所涉及的系统,其中包括实际上将第一步的主要关键指标下降。 事实上,在我们甚至接近重新devise之前,放弃这一指标在生产中是必要的,仅仅是为了从停机中恢复过来。 重新devise包括寻找其他方法来确保主键的唯一性和快速访问数据。
主键始终是默认索引的。
您可以使用SQL Server Management Studio或Transact-SQL在SQL Server 2012中定义主键。 创build一个主键会自动创build一个相应的唯一的,聚集的或非聚集的索引。
一个PK将成为一个聚集索引,除非你指定非聚集
在这里从MSDN的通道:
为表指定PRIMARY KEY约束时,数据库引擎通过为主键列创build唯一索引来强制实现数据唯一性。 此索引还允许在查询中使用主键时快速访问数据。 因此,所选的主键必须遵循创build唯一索引的规则。
使它成为主键还应该自动为其创build索引。
那么在SQL Server中,一般情况下,主键是自动索引的。 这是真的,但不能保证更快的查询。 当只有一个字段作为主键时,主键会带给你极好的性能。 但是,当有多个字段作为主键时,则索引是基于这些字段的。
例如:字段A,B,C是主键,因此,当您根据WHERE CLAUSE中的这3个字段进行查询时,性能很好,但是当您想在WHERE CLAUSE中仅使用C字段进行查询时,不会得到好的performance。 因此,要使您的性能得以运行,您需要手动对C字段进行索引。
大多数情况下,直到你点击了100多万条logging,你才会看到这个问题。
我有一个巨大的数据库,没有(单独的)索引。
任何时候,我通过主键查询结果,所有密集的目的,即时。
主键被自动编入索引
您可以使用pk根据您的使用情况创build额外的索引
- 索引zip_code,如果您经常通过zip_code和id进行select,则id可能会有所帮助