聚簇索引与非聚簇索引的区别

来源:互联网 发布:淘宝买家信用 编辑:程序博客网 时间:2024/05/16 17:50

         通常情况下,建立索引是加快查询速度的有效手段,但是索引不是万能的,仅仅依赖索引并不能实现对所有数据的快速存取。事实上,如果索引策略与数据检索需求严重不符的话,建立索引反而会降低查询性能。因此在实际使用当中,应当充分考虑索引的开销,包括磁盘空间的开销及处理开销(如:资源开销与加锁)。例如,数据如果频繁的跟新或删加,就不宜建立索引。

       本文简要讨论一下聚簇索引的特点及其与非聚簇索引的区别。

(1)定义

 聚簇索引的顺序就是数据的物理存储顺序,即表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致;

 非聚簇索引的解释是:索引顺序与数据物理排列顺序无关。

(2)索引底层实现结构是B+树,二叉树的一种;

  聚簇索引:索引的叶节点就是数据节点(索引值),对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。 在一张表上最多只能创建一个聚集索引,因为真实数据的物理顺序只能有一种。

  而非聚簇索引的叶节点仍然是索引节点(告诉你怎么在表中查找这一记录),只不过有一个指针指向对应的数据块。对于非聚集索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,其行数量与数据表行数据量一致。如下图(原图请见http://www.jb51.NET/article/29693.htm):

(3)建立索引:

在SQL语言中,建立聚簇索引使用CREATE INDEX语句,格式为:CREATE CLUSTER INDEX index_name ON table_name(column_name1,column_name2,...);

总结一下:
聚集索引是一种稀疏索引,数据页上一级的索引页存储的是页指针,而不是行指针。而对于非聚集索引,则是密集索引,在数据页的上一级索引页它为每一个数据行存储一条索引记录。



索引快的原因:

大家都知道,索引可以提高检索效率,因为它的二叉树结构以及占用空间小,所以访问速度块。让我们来算一道数学题:如果表中的一条记录在磁盘上占用 1000字节的话,我们对其中10字节的一个字段建立索引,那么该记录对应的索引块的大小只有10字节。我们知道,SQL Server的最小空间分配单元是“页(Page)”,一个页在磁盘上占用8K空间,那么这一个页可以存储上述记录8条,但可以存储索引800条。现在我 们要从一个有8000条记录的表中检索符合某个条件的记录,如果没有索引的话,我们可能需要遍历8000条×1000字节/8K字节=1000个页面(数据块)才能 够找到结果。如果在检索字段上有上述索引的话,那么我们可以在8000条×10字节/8K字节=10个页面(索引快)中就检索到满足条件的索引块,然后根据索引块上 的指针逐一找到结果数据块,这样IO访问量要少的多。

索引优化技术

是不是有索引就一定检索的快呢?答案是否。有些时候用索引还不如不用索引快。比如说我们要检索上述表中的所有记录,如果不用索引,需要访问8000 条×1000字节/8K字节=1000个页面,如果使用索引的话,首先检索索引,访问8000条×10字节/8K字节=10个页面得到索引检索结果,再根 据索引检索结果去对应数据页面,由于是检索所有数据(B+树查询是从根节点到子节点遍历一遍的,所以需要检索所有数据),所以需要再访问8000条×1000字节/8K字节=1000个页面将全部数据读取出来,一共访问了 1010个页面,这显然不如不用索引快。

索引对应的SQL语句

(1)为student表的sno列创建非聚簇索引

use db1

create index IX_Stu_Sno on Student(sno)

(2)为student表的sno列创建唯一的聚簇索引

use db1

create unique clustered index IX_Stu_Sno1 on Student(sno)

总结索引使用场景:

1:不要索引数据量不大的表,对于小表来讲,表扫描的成本并不高。
2:不要设置过多的索引,在没有聚集索引的表中,最大可以设置249个非聚集索引,过多的索引首先会带来更大的磁盘空间,而且在数据发生修改时,对索引的维护是特别消耗性能的。
3:合理应用复合索引,有某些情况下可以考虑创建包含所有输出列的覆盖索引。
4:对经常使用范围查询的字段,可能考虑聚集索引。
5:避免对不常用的列,逻辑性列,大字段列创建索引。


原创粉丝点击