首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sql主键和索引

sql主键和索引
EN

Stack Overflow用户
提问于 2009-01-20 18:28:00
回答 11查看 110.6K关注 0票数 110

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

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

编辑:一个额外的问题--额外索引主键会有什么坏处吗?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-01-20 18:51:54

您是对的,SQL Server允许您在同一字段上创建重复的索引,这是令人困惑的。但是,您可以创建另一个索引并不意味着PK索引不存在。

额外的索引没有好处,但唯一的坏处(非常小)是额外的文件大小和行创建开销。

票数 75
EN

Stack Overflow用户

发布于 2009-01-20 19:01:40

正如其他人已经说过的那样,主键是自动索引的。

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

例如,您有一个包含许多列的表,但您只查询ID、Name和Address列。以ID作为主键,我们可以创建以下建立在ID上的索引,但包括Name和Address列。

代码语言:javascript
运行
复制
CREATE NONCLUSTERED INDEX MyIndex
ON MyTable(ID)
INCLUDE (Name, Address)

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

代码语言:javascript
运行
复制
SELECT ID, Name, Address FROM MyTable WHERE ID > 1000

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

票数 56
EN

Stack Overflow用户

发布于 2009-01-20 20:07:56

注意:此答案针对企业级开发in-the-large__.

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

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

现在是有趣的部分--什么时候不需要惟一的主键索引?当您的表获取了足够的数据(行),使得索引的维护成本太高时,您不想要一个,也不能容忍一个。这取决于硬件、RDBMS引擎、表和数据库的特性以及系统负载。但是,它通常在表达到几百万行时开始显现。

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

我曾经多次处理过这个问题,这些表有20亿行,每天有8TB的存储空间和4000万次行插入。我的任务是重新设计涉及的系统,其中包括删除唯一的主键索引,实际上作为第一步。事实上,在我们甚至接近重新设计之前,在生产中仅仅为了从停机中恢复,就需要删除该索引。这种重新设计包括寻找其他方法来确保主键的唯一性并提供对数据的快速访问。

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/462477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档