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

 

原文:http://www.cnblogs.com/mybluesky99/archive/2011/04/21/2023629.html

 

以下为整理的几个主要问题

主要有以下两个区别:

  1. 聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个
  2. 聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续

问题:

1. 聚集索引的约束是唯一性,是否要求字段也是唯一的呢?

从理论上讲,聚集索引可以创建在任何一列你想创建的字段上,实际情况并不能随便指定,否则在性能上会是恶梦。

 

2. 是不是聚集索引就一定要比非聚集索引性能优呢?

如果想查询学分在60-90之间的学生的学分以及姓名,在学分上创建聚集索引是否是最优的呢?

答:否。既然只输出两列,我们可以在学分以及学生姓名上创建联合非聚集索引,此时的索引就形成了覆盖索引,即索引所存储的内容就是最终输出的数据,这种索引在比以学分为聚集索引做查询性能更好。

 

3. 在数据库中通过什么描述聚集索引与非聚集索引的?

索引是通过二叉树的形式进行描述的,我们可以这样区分聚集与非聚集索引的区别:聚集索引的叶节点就是最终的数据节点,而非聚集索引的叶节仍然是索引节点,但它有一个指向最终数据的指针。

 

4. 在主键是创建聚集索引的表在数据插入上为什么比主键上创建非聚集索引表速度要慢?

在有主键的表中插入数据行,由于有主键唯一性的约束,所以需要保证插入的数据没有重复。我们来比较下主键为聚集索引和非聚集索引的查找情况:聚集索引由于索引叶节点就是数据页,所以如果想检查主键的唯一性,需要遍历所有数据节点才行,但非聚集索引不同,由于非聚集索引上已经包含了主键值,所以查找主键唯一性,只需要遍历所有的索引页就行,这比遍历所有数据行减少了不少IO消耗。这就是为什么主键上创建非聚集索引比主键上创建聚集索引在插入数据时要快的真正原因。

 

 

 

posted on 2014-06-25 13:22  alex_cool  阅读(3144)  评论(0编辑  收藏  举报