`
MauerSu
  • 浏览: 497929 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

主键和聚集索引

阅读更多
主键和聚集索引
源:http://blog.csdn.net/zhangsuiwen/article/details/5087154
评:

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

主键(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 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。

 

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

分享到:
评论

相关推荐

    简单例子理解主键,索引,聚集索引,复合索引,非聚合索引

    一、 创建主键(主键=主键索引=聚集索引) 主键是什么? 答:拿主键可以唯一确定一条数据,它和物理存储排序一致,不能为空,一个表只能有一个。 原本没有创建的主键的表在磁盘上存储为: Id=0;username=username0;sex...

    主键与聚集索引

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

    MySQL索引之主键索引

    上次的分享我们介绍了聚集索引和非聚集索引的区别,本次我们继续介绍主键索引和辅助索引的区别。 1、主键索引 主键索引,简称主键,原文是PRIMARY KEY,由一个或多个列组成,用于唯一性标识数据表中的某一条记录。一...

    SQL Server 索引基础知识

    整理了一下郭红俊大哥的关于SQL索引...4.主键与聚集索引 5.理解newid()和newsequentialid() 6.索引的代价,使用场景 7.Indexing for AND 8.数据基本格式补充 9.Indexing for OR 10.Joins 时的三种算法简介档,方便查询.

    Sql Server 数据库视图 索引等

    视图索引存储过程 事务显示事务 隐式事务 --索引 作用:提高查询效率 降低新增修改和删除的效率 --主键索引 唯一索引 聚集索引非聚集索引 --创建索引 --索引index 默认创建的是不唯一,非聚集索引

    关于MySQL面试题中有关索引的九大难点全在这里了

    o非聚集索引:非聚集索引就是以非主键创建的索引,在叶子节点存储的是主键和索引列。 逻辑维度 o主键索引:一种特殊的唯一索引,不允许有空值。 o普通索引:MySQL中基本索引类型,允许空值和重复值。 o联合索引:多...

    【数据库】浅析Innodb的聚集索引与非聚集索引

    Mysql存储引擎之一的Innodb的索引,可以分为聚集索引与非聚集索引,这两种索引都是使用B+树组织的。 本文不讲解什么是索引,对索引不了解的同学可以先移步到我的另外一篇文章【数据库】mysql索引简谈 在分析这两种...

    SQLSERVER聚集索引和主键(Primary Key)的误区认识

    很多人会把Primary Key和聚集索引搞混起来,或者认为这是同一个东西。这个概念是非常错误的。 主键是一个约束(constraint),他依附在一个索引上,这个索引可以是聚集索引,也可以是非聚集索引。 所以在一个(或一...

    SQL Server索引基础知识.pdf

    自己制作的pdf,目录包括如下: <br>记录数据的基本格式 3 聚集索引,非聚集索引 8 测试中常看指标和清除缓存方法 15 主键与聚集索引 18 理解newid()和newsequentialid() 20 索引的代价,使用场景 ...

    sql 聚集索引和非聚集索引(详细整理)

    聚集索引 一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。 聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表...

    Mysql-索引原理分析

    1 .索引的存储结构是什么? 是B树、B+树还是二叉树 2.什么是聚集索引? 聚集索引的主键索引和次要索引区别是什么 3.什么是非聚集索引? 非聚集索引的主键索引和次要索引区别是什么

    【MySQL】经验:索引使用场景

    InnoDB中会自动为主键建立聚集索引,即使没有定义主键,也会自动生成一个隐藏主键建立索引;MyISAM中不会自动生成主键。建议给每张表指定主键。 2、频繁作为查询条件的字段 索引是以空间换时间的,某字段如果频繁...

    MySQL常见面试题总结.pdf

    聚集索引和⾮聚集索引的区别, 聚集索引的约束是唯⼀性,是否要求字段也是唯⼀的呢?, 为什么聚集索引可以创建在任何⼀列上,如果此表没有主键约束,即有可能存在重复⾏数据呢?, 在主键上创建聚集索引的表在数据...

    JAVA面试题MySQL索引原理及索引优化校招面试找工作笔试

    B+树介绍,为什么选择B+树,非聚集索引 聚集索引 第一点、第二点、第三点 不建议使用过长的字段,不建议使用非自增字段作为主键 什么条件下使用索引? 索引选择性,行数前缀索引 所谓索引的选择性是指不重复的索引值...

    MySQL中主键索引与聚焦索引之概念的学习教程

    主键索引 主键索引,简称主键,原文是PRIMARY KEY,由一个或多个列组成,用于唯一性标识数据表中的某一条记录。一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL。 在MySQL中,InnoDB数据表的主键...

    浅析InnoDB索引结构

    0、导读 InnoDB表的索引有哪些特性,以及索引组织结构是怎样的 1、InnoDB聚集索引特点 ...如果有显式定义的主键(PRIMARY KEY),则会选择该主键作为聚集索引否则,选择第一个所有列都不允许为NULL的唯

    CcoWzh#Interview-Of-Programmer#MySQL索引原理1

    MySQL索引原理查找算法:二叉查找树BitMap位图索引分类主键索引唯一索引普通索引全文索引索引原理解析B+树聚集索引和非聚集索引建立索引创建表时指定组合索引

Global site tag (gtag.js) - Google Analytics