主键与聚集索引的区别

有些人可能对主键和聚集索引有所混淆,其实这两个是不同的概念,下面是一个简单的描述。不想看绕口文字者,直接看两者的对比表。尤其是最后一项的比较。

主键(PRIMARY KEY )

来自MSDN的描述:

表通常具有包含唯一标识表中每一行的值的一列或一组列。这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性。在创建或修改表时,您可以通过定义 PRIMARY KEY 约束来创建主键。

一个表只能有一个 PRIMARY KEY 约束,并且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束可保证数据的唯一性,因此经常对标识列定义这种约束。

如果为表指定了 PRIMARY KEY 约束,则 SQL Server 2005 数据库引擎 将通过为主键列创建唯一索引来强制数据的唯一性。当在查询中使用主键时,此索引还可用来对数据进行快速访问。因此,所选的主键必须遵守创建唯一索引的规则。

创建主键时,数据库引擎 会自动创建唯一的索引来强制实施 PRIMARY KEY 约束的唯一性要求。如果表中不存在聚集索引或未显式指定非聚集索引,则将创建唯一的聚集索引以强制实施 PRIMARY KEY 约束。

聚集索引

聚集索引基于数据行的键值在表内排序和存储这些数据行。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。

每个表几乎都对列定义聚集索引来实现下列功能:

  • 可用于经常使用的查询。
  • 提供高度唯一性。

两者的比较

下面是一个简单的比较表

  主键 聚集索引
用途 强制表的实体完整性 对数据行的排序,方便查询用
一个表多少个 一个表最多一个主键 一个表最多一个聚集索引
是否允许多个字段来定义 一个主键可以多个字段来定义 一个索引可以多个字段来定义
     
是否允许 null 数据行出现 如果要创建的数据列中数据存在null,无法建立主键。
创建表时指定的 PRIMARY KEY 约束列隐式转换为 NOT NULL。
没有限制建立聚集索引的列一定必须 not null .
也就是可以列的数据是 null
参看最后一项比较
是否要求数据必须唯一 要求数据必须唯一 数据即可以唯一,也可以不唯一。看你定义这个索引的 UNIQUE 设置。
(这一点需要看后面的一个比较,虽然你的数据列可能不唯一,但是系统会替你产生一个你看不到的唯一列)
     
创建的逻辑 数据库在创建主键同时,会自动建立一个唯一索引。
如果这个表之前没有聚集索引,同时建立主键时候没有强制指定使用非聚集索引,则建立主键时候,同时建立一个唯一的聚集索引
如果未使用 UNIQUE 属性创建聚集索引,数据库引擎 将向表自动添加一个四字节 uniqueifier 列。
必要时,数据库引擎 将向行自动添加一个 uniqueifier 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。

参考:

下面这个帖子中大力的回复:
http://topic.csdn.net/t/20021212/16/1255429.html

关于主键,非聚集索引,聚集索引,看看好吗?!

您好,想请教一下您以下一些问题:聚集索引对范围查询比较有用,只要找到边界值所在的位置便可以确定所查询之目标范围,但是对于单个的查询是起不到多大作用的。   
  我的很多查询是单个产品代号的在线查询,所以最好以先后时间建立聚集索引,产品代号虽然是查询条件,但是这个代号的变化范围很大,经过很多测试后代号顺序很乱,如果用它建聚集所以,如果后提交的代号较小,需要在物理位置上插到已有数据的中间,那么他后面所有数据都要向后移位,每次都挪动很多数据其不是很费资源,还不如建个非聚集索引,毕竟插入动作的频率远远高于查询动作,而以提交时间建聚集索引遵循先来先到的原则,一般不需要挪动数据的,所以这样对于插入很频繁的操作要更好一些。   
  对于每次插入前都要检查唯一性的列是不是一定要建成主键。   
  是不是每张表必须有个聚集索引索引,如果我不指定聚集索引,那么它以什么样的顺序进行物理排列呢?是不是先来先到的原则,早提交的在前面,后提交的在后面,每次插入只是追加,不用去挪动很多数据?   
  那个填充因子从0到100,范围太大,并且我一点都不知道他的意义,不知道是做什么用的,能否给我个经验值?  
  文件组也没有理解,听您的意思,如果我存放数据的逻辑盘是由多个物理硬盘构成的,可以选择文件组来进行并行处理,可以提高性能。我的数据文件是放在多个硬盘组成的磁盘阵列中的,按理因该选文件组,但是好像只有一个primary可供选择,是否选这个就行了?   
    
  是不是所有表一定得有主键,我到底有没有必要为了建立主键而去建一个毫无意义的自增列?   
    
  我对这方面懂得很少,以上是对于几位热心人回复贴的理解,不知道对不对,麻烦您给解答一下,不甚感激,谢谢!

1 楼jaguarcts(xzh2000)

聚集索引对范围查询比较有用,只要找到边界值所在的位置便可以确定所查询之目标范围,但是对于单个的查询是起不到多大作用的。   
  ----应该也起作用,你可以在查询分析器查执行路径   
    
  对于每次插入前都要检查唯一性的列是不是一定要建成主键。   
  是不是每张表必须有个聚集索引索引,如果我不指定聚集索引,那么它以什么样的顺序进行物理排列呢?是不是先来先到的原则,早提交的在前面,后提交的在后面,每次插入只是追加,不用去挪动很多数据?   
  ----这个问题不一定,主要看你要达到的目的,不过作开发最好是每个表都要有主键,SQL中主键本身就是聚集索引   
    
  那个填充因子从0到100,范围太大,并且我一点都不知道他的意义,不知道是做什么用的,能否给我个经验值?  
  ----如果每个块中数据都充满了,当新的更新使比原来的数据长度大,会使索引破   
  碎,如果数据更新多,填充因子要大一些,反之。。。   
    
  文件组也没有理解,听您的意思,如果我存放数据的逻辑盘是由多个物理硬盘构成的,可以选择文件组来进行并行处理,可以提高性能。我的数据文件是放在多个硬盘组成的磁盘阵列中的,按理因该选文件组,但是好像只有一个primary可供选择,是否选这个就行了?   
  ----文件组是为了更方便管理表所用的,你可以创建很多的文件组,将文件分布在   
  不同的组,可以控制表放在某一个文件组。   
  如create   table   a_test(id   decimal(8,2))   on   [second]   
  表示a_test创建在second文件组中,而second在另一块硬盘上。   
    
    
    
   
2 楼sky_blue(蓝天2007)

"毕竟插入动作的频率远远高于查询动作"   这样用聚集索引的确负作用大。   
  "对于每次插入前都要检查唯一性的列是不是一定要建成主键。"不一定,可以建立唯一性约束   
  "我到底有没有必要为了建立主键而去建一个毫无意义的自增列"   
  个人意见还是建上好

3 楼tj_dns(愉快的登山者)

1。聚集索引对于单个的查询比没有索引要起作用;   
  2。同意建立产品代号非聚集索引;   
  3。最好将每次插入前都要检查唯一性的列建成主键;便于查错;   
  4。不是每张表必须有个聚集索引,如果不指定聚集索引,是先来先到的原则;   
  5。60%,如果建立聚集索引,且总有中间索引插入,此值就要考虑小一些,留出空间来;但值太小,索引的层次就要增加,反过来会影响速度。   
  6。在磁盘阵列中的也可以建立多个文件,但意义不很大;   
  7。不是所有表一定得有主键,要看需要,自增列也是;

4 楼ToUpdate(老六)

UP

5 楼pengdali()

参考:   
  簇集索引=聚集索引:   
  聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。   
    
  聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。例如,如果应用程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此类查询的性能。同样,如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节省成本。   
    
  非簇集索引:   
  非聚集索引与聚集索引一样有   B   树结构,但是有两个重大差别:     
    
  数据行不按非聚集索引键的顺序排序和存储。   
    
    
  非聚集索引的叶层不包含数据页。     
  相反,叶节点包含索引行。每个索引行包含非聚集键值以及一个或多个行定位器,这些行定位器指向有该键值的数据行(如果索引不唯一,则可能是多行)。   
    
  非聚集索引可以在有聚集索引的表、堆集或索引视图上定义。在   Microsoft®   SQL   Server™   2000   中,非聚集索引中的行定位器有两种形式:     
    
  如果表是堆集(没有聚集索引),行定位器就是指向行的指针。该指针用文件标识符   (ID)、页码和页上的行数生成。整个指针称为行   ID。   
    
    
  如果表没有聚集索引,或者索引在索引视图上,则行定位器就是行的聚集索引键。如果聚集索引不是唯一的索引,SQL   Server   2000   将添加在内部生成的值以使重复的键唯一。用户看不到这个值,它用于使非聚集索引内的键唯一。SQL   Server   通过使用聚集索引键搜索聚集索引来检索数据行,而聚集索引键存储在非聚集索引的叶行内。     
  由于非聚集索引将聚集索引键作为其行指针存储,因此使聚集索引键尽可能小很重要。如果表还有非聚集索引,请不要选择大的列作为聚集索引的键。   
    
    
  唯一索引:   
  唯一索引可以确保索引列不包含重复的值。在多列唯一索引的情况下,该索引可以确保索引列中每个值组合都是唯一的。   
  唯一索引既是索引也是约束。   
    
  复合索引:   
  索引项是多个的就叫组合索引,也叫复合索引。   
  复合索引使用时需要注意索引项的次序。

时间: 2024-12-22 13:01:20

主键与聚集索引的区别的相关文章

SQL Server中的联合主键、聚集索引、非聚集索引

我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我们依然可以通过对联合主键中的首列除外的其他列建立非聚集索引来提高性能.本文将对联合主键.聚集索引.非聚集索引对查询性能的影响举例说明.步骤一,建立一个测试表,并且插入350万条以上的数据. /*创建测试数据表*/create table MyTestTable(id varchar(10)not n

主键,组合主键,聚集索引,非聚集索引,唯一索引

前言: 基于Oracle数据库谈谈索引们的问题,以及在什么情况下使用什么索引, 组合主键,怎么根据实际业务需求来定制自己的索引,主键的应用,来提升系统的性能. 1:主键? 在表中唯一的,也是聚集索引.作用于快速查询.该列唯一. Java代码 复制代码 收藏代码 1.ID NUMBER(38,0) PRIMARY KEY NOT NULL, 2:组合主键? 在表中以多个字段组成在表中是唯一的,也是聚集索引.作用于快速查询.该组合列唯一. Java代码 复制代码 收藏代码 1.CREATE TABL

mysql 主键和唯一索引的区别

主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键. 唯一性索引列允许空值,而主键列不允许为空值. 主键列在创建时,已经默认为非空值 + 唯一索引了. 主键可以被其他表引用为外键,而唯一索引不能. 一个表最多只能创建一个主键,但可以创建多个唯一索引. 主键和唯一索引都可以有多列. 主键更适合那些不容易更改的唯一标识,如自动递增列.身份证号等. 在 RBO 模式下,主键的执行计划优先级要高于唯一索引. 两者可以提高查询的速度.

聚集索引和非聚集索引的区别有哪些

SQL SERVER提供了两种索引:聚集索引和非聚集索引.其中聚集索引表示表中存储的数据按照索引的顺序存储,检索效率比非聚集索引高,但对数据更新影响较大.非聚集索引表示数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置,非聚集索引检索效率比聚集索引低,但对数据更新影响较小. 方法/步骤 1  聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序.      聚集索引确定表中数据的物理顺序.聚集索引类似于电话簿,后者按姓氏排列数据.由于聚集索引规定数据在表中的物理存储顺

你能说出SQL聚集索引和非聚集索引的区别吗?

最近突然想起前一阵和一朋友的聊天,当时他问我的问题是一个非常普通的问题:说说SQL聚集索引和非聚集索引的区别. AD:WOT2015 互联网运维与开发者大会 热销抢票 其实对于非专业的数据库操作人员来讲,例如软件开发人员,在很大程度上都搞不清楚数据库索引的一些基本知识,有些是知其一不知其二,或者是知其然不知其所以然.造成这种情况的主要原因我觉的是行业原因,有很多公司都有自己的DBA团队,他们会帮助你优化SQL,开发人员即使不懂优化问题也不大,所以开发人员对这方面也就不会下太多功夫去了解SQL优化

SQL聚集索引和非聚集索引的区别

其实对于非专业的数据库操作人员来讲,例如软件开发人员,在很大程度上都搞不清楚数据库索引的一些基本知识,有些是知其一不知其二,或者是知其然不知其所以然.造成这种情况的主要原因我觉的是行业原因,有很多公司都有自己的DBA团队,他们会帮助你优化SQL,开发人员即使不懂优化问题也不大,所以开发人员对这方面也就不会下太多功夫去了解SQL优化,但如果公司没有这样的DBA呢,就只能靠程序员自己了. 最近突然想起前一阵和一朋友的聊天,当时他问我的问题是一个非常普通的问题:说说SQL聚集索引和非聚集索引的区别.

聚集索引和非聚集索引的区别有哪些(转)

转载链接:http://www.qeefee.com/article/ws00000543 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物理顺序. 聚集索引确定表中数据的物理顺序.聚集索引类似于电话簿,后者按姓氏排列数据.由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引.但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样. 聚集索引使用注意事项 定义聚集索引键时使用的列越少越好.      • 包含大量非重复值的列.      • 使用下列运算符

聚集索引和非聚集索引的区别

聚集索引和非聚集索引的区别:        汉语字典的正文本身就是一个聚集索引.比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部.如果您翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明您的字典中没有这个字:同样的,如果查“张”字,那您也会将您的字典翻到最后部分,因为“张”的拼音是“zhang”.也就是说,字典的正文部分本身就是一个目录,您不需要再去查其他目录

堆表上的唯一与非唯一非聚集索引的区别

在这篇文章里,我想详细介绍下SQL Server里唯一与非唯一非聚集索引的区别.看这个文章前,希望你已经理解了聚集和非聚集索引的概念,还有在SQL Server里是如何使用的. 很多人对唯一和非唯一索引非聚集索引的认识都不是很清晰.事实上,SQL Server在存储上这2类索引有着本质的区别,这些区别会影响到索引占用空间的大小和索引的使用效率. 今天我们从SQL Server里的堆表(Heap table) ,它是没有聚集索引定义的表,在它建立唯一和非唯一非聚集索引,来开始我们的分析.下列脚本会