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

聚集索引和非聚集索引的根本区别:

【1】 聚集索引:

       表排列顺序:表记录的排列顺序与索引的排列顺序一致。

       查询速度快因为一旦具有第一个索引值的纪录被找到,具有连续索引值的记录也一定物理的紧跟其后。

       聚集索引的缺点对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度

       个数:一个表中已经有一个聚集索引,个表不可能有两个或以上的聚集索引

       使用场合:

a.此列包含有限数目的不同值; 
     b.查询的结果返回一个区间的值; 
    c.查询的结果返回某值相同的大量结果集。

【2】 非聚集索引

表排列顺序:物理顺序和索引的顺序不一致

索引重组:非聚集索引比聚集索引层次多,添加记录不会引起数据顺序的重组

使用场合:

a.此列包含了大量数目不同的值; 
b.查询的结束返回的是少量的结果集; 
c.order   by   子句中使用了该列。

【3】举例说明聚集索引和非聚集索引的区别

那么在SQL Server中他们有关系吗?以前我也认为没有,可是今天看了这个讲座后,才知道不单单是有关系,而且非常之大。举例说明

create clustered idx_name on table(name)

create idx_no on table(no)

表中实际的数据存储方式为

table

no       name           remark

1         a

3         a

2         b

5         b

4         c       xxc1

6         c       xxc2

 

聚集索引数据页

建值地址 健值 数据地址

0001    a     XXXX

0002    b     XXXX

0003    c     XXc1

 

非聚集索引数据页

健值 聚集建值 聚集地址

1     a           0001

2     b           0002

3     a           0001

4     c           0003

5     b           0002

6     c           0003

 

select * from table where no =4

 

(1)先根据非聚集索引进行索引查找,找到聚集健值c

(2)然后根据c值,在聚集索引中查找到数据地址XXc1

(3)然后从xxc1开始比较no = 4的数据行,找后返回

 

大体应该就是这个样子了,不知道理解是否到位。从上面的分析我们可以看出,对于聚集索引的创见,是一个很关键的问题,如果创建的好,将有助于提高效率,如果创建的不好,反而会降低性能。为什么哪?

 

比如我们把聚集索引创建在no列上,其实和没有创建聚集索引查不太多,因为no列是一个唯一的顺序列,有多少行no就有多少行索引行,意义不大。所以在创建聚集索引的时候一定不能拍拍屁股就决定下来,要根据具体情况,尤其是表中的数据情况进行分析后再决定。

 

你可能感兴趣的:(聚集索引和非聚集索引的根本区别)