sql主键和索引

dan*_*ifo 102 t-sql sql-server indexing primary-key

假设我在数据库集中有一个ID行(int)作为主键.如果我经常查询ID,我还需要索引吗?或者它是否是主键意味着它已被索引?

我问的原因是因为在MS SQL Server中我可以在这个ID上创建一个索引,正如我所说的那样是我的主键.

编辑:一个额外的问题 - 额外索引主键会不会有任何损害?

dkr*_*etz 68

你是对的,SQL Server允许你在同一个字段上创建重复索引,这让人很困惑.但是您可以创建另一个并不表示PK索引也不存在.

附加索引没有用,但唯一的危害(非常小)是额外的文件大小和行创建开销.

  • 未使用的指标的损坏确实非常有害.首先,索引会占用存储空间.另一方面,它减慢了写入和更新速度.始终删除不会使用的索引. (35认同)

red*_*ver 46

正如其他人已经说过的那样,主键会自动编入索引.

只有在需要优化使用主键和其他特定列的查询时,才能在主键列上创建更多索引.通过在主键列上创建另一个索引并包含其他一些列,您可以达到查询所需的优化.

例如,您有一个包含许多列的表,但您只查询ID,Name和Address列.将ID作为主键,我们可以创建以ID为基础的索引,但包括Name和Address列.

CREATE NONCLUSTERED INDEX MyIndex
ON MyTable(ID)
INCLUDE (Name, Address)
Run Code Online (Sandbox Code Playgroud)

因此,当您使用此查询时:

SELECT ID, Name, Address FROM MyTable WHERE ID > 1000
Run Code Online (Sandbox Code Playgroud)

SQL Server将仅使用您创建的索引为您提供结果,并且它不会从实际表中读取任何内容.


Rob*_*ams 28

注意:这个答案解决了大型企业级开发问题.

这是一个RDBMS问题,而不仅仅是SQL Server,行为可能非常有趣.首先,虽然主键被自动(唯一)索引是很常见的,但它并不是绝对的. 有时必须对主键进行唯一索引.

在大多数RDBMS中,如果主键不存在,将自动在主键上创建唯一索引.因此,您可以在将主键列声明为主键之前在主键列上创建自己的索引,然后在应用主键声明时,数据库引擎将使用该索引(如果可接受).通常,您可以创建主键并允许创建其默认唯一索引,然后在该列上创建自己的备用索引,然后删除默认索引.

现在为有趣的部分 - 你什么时候不想要一个独特的主键索引?当您的表获取足够的数据(行)以使索引的维护过于昂贵时,您不需要一个,也不能容忍一个.这取决于硬件,RDBMS引擎,表和数据库的特征以及系统负载.但是,一旦表达到几百万行,它通常会开始显现.

关键问题是每行插入一行或更新主键列都会导致索引扫描以确保唯一性.随着表的增长,这种独特的索引扫描(或其在任何一个RDBMS中的等价物)变得更加昂贵,直到它支配表的性能.

我已经多次处理这个问题,表格大到20亿行,8 TB的存储空间和每天4千万行插入.我的任务是重新设计所涉及的系统,其中包括丢弃唯一的主键索引,实际上是第一步.实际上,在我们接近重新设计之前,放弃该指数在生产中是必要的,只是为了从停电中恢复过来.重新设计包括寻找其他方法来确保主键的唯一性并提供对数据的快速访问.


jco*_*lum 19

默认情况下始终将主键编入索引.

您可以使用SQL Server Management Studio或Transact-SQL在SQL Server 2012中定义主键.创建主键会自动创建相应的唯一,聚簇或非聚簇索引.

http://technet.microsoft.com/en-us/library/ms189039.aspx


SQL*_*ace 8

除非指定non clustered,否则PK将成为聚簇索引


Mic*_*Sim 8

这里是来自MSDN的段落:

为表指定PRIMARY KEY约束时,数据库引擎通过为主键列创建唯一索引来强制实施数据唯一性.当在查询中使用主键时,此索引还允许快速访问数据.因此,选择的主键必须遵循创建唯一索引的规则.


got*_*tqn 5

声明PRIMARY KEYorUNIQUE约束会导致 SQL Server 自动创建索引。

可以在不匹配约束的情况下创建唯一索引,但没有唯一索引就不能存在约束(主键或唯一键)。

从这里开始,约束的创建将:

  • 导致创建同名索引
  • 拒绝删除创建的索引,因为没有它就不允许存在约束

同时删除约束将删除关联的索引。

那么, aPRIMARY KEY或之间是否存在实际差异UNIQUE INDEX

  • NULL中不允许值PRIMARY KEY,但允许在UNIQUE索引中;就像在集合运算符(UNION、EXCEPT、INTERSECT)中一样,NULL = NULL这意味着您只能有一个值,因为两个NULLs 彼此重复;
  • PRIMARY KEY每个表只能存在一个,而可以创建999 个唯一索引
  • PRIMARY KEY创建约束时,除非表上已经存在聚集索引或NONCLUSTERED在其定义中使用了聚集索引,否则将其创建为聚集索引;UNIQUE创建索引时,NONCLUSTERED除非它不是特定的CLUSTERED并且已经不存在,否则它会被创建;