聚集索引和非聚集索引

语法: CREATE CLUSTERED INDEX myIndex ON myTable (id_column)

     

    第一:聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个,这个跟没问题没差别,一般人都知道。
        第二:聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续,这个大家也都知道。


        上面的两点从大的方面讲都是讲的通的,后面我们继续探讨,举一个实际点的例子,一个学生表student,里面是学生号id,学生姓名,学生所在城市ID,学生成绩(总分),
        问:如果想按姓名查询,如何做优化?
        答:在姓名字段上建立索引。
        问:建立什么类型的索引?
        答:建立非聚集索引。
        问:如果想按学生的学分范围来查找呢,例如查找得分在60-90的?
        答:在学分字段上创建聚集索引?
        问:为什么?
        答:一般有范围查询的需求,可以考虑在此字段上创建聚集索引。
        问:学分有重复性,在学分字段上创建聚集索引能行吗?
        ....沉思,不能创建吗?之前的项目好像真这样做过
        答:应该可以吧。
        问:聚集索引的约束是什么?
        答:唯一性啊?
        问:既然是唯一性,那么学分字段上还能创建聚集索引吗?
        ....再次沉思,应该可以啊,但索引的约束又怎么说呢?
        答:应该可以的,以前用过。
        
        我自认为是对数据库索引知识有一定研究的,但可能是有两年没实际接触SQL的原因,一时还真想不出具有说服力的解释,朋友们看到这能解答我的问题吗?
        
        其实上面的我们需要搞清楚以下几个问题:


        第一:聚集索引的约束是唯一性,是否要求字段也是唯一的呢?
        分析:如果认为是的朋友,可能是受系统默认设置的影响,一般我们指定一个表的主键,如果这个表之前没有聚集索引,同时建立主键时候没有强制指定使用非聚集索引,SQL会默认在此字段上创建一个聚集索引,而主键都是唯一的,所以理所当然的认为创建聚集索引的字段也需要唯一。
        结论:聚集索引可以创建在任何一列你想创建的字段上,这是从理论上讲,实际情况并不能随便指定,否则在性能上会是恶梦。
        
        第二:为什么聚集索引可以创建在任何一列上,如果此表没有主键约束,即有可能存在重复行数据呢?
        粗一看,这还真是和聚集索引的约束相背,但实际情况真可以创建聚集索引,分析其原因是:如果未使用 UNIQUE 属性创建聚集索引,数据库引擎将向表自动添加一个四字节 uniqueifier 列。必要时,数据库引擎 将向行自动添加一个 uniqueifier 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。
            
        第三:是不是聚集索引就一定要比非聚集索引性能优呢?
        如果想查询学分在60-90之间的学生的学分以及姓名,在学分上创建聚集索引是否是最优的呢?
        答:否。既然只输出两列,我们可以在学分以及学生姓名上创建联合非聚集索引,此时的索引就形成了覆盖索引,即索引所存储的内容就是最终输出的数据,这种索引在比以学分为聚集索引做查询性能更好。
        
        第四:在数据库中通过什么描述聚集索引与非聚集索引的?
        索引是通过二叉树的形式进行描述的,我们可以这样区分聚集与非聚集索引的区别:聚集索引的叶节点就是最终的数据节点,而非聚集索引的叶节仍然是索引节点,但它有一个指向最终数据的指针。

 

下面的表总结了何时使用聚集索引或非聚集索引(很重要)。

 

 

 

动作描述

使用聚集索引

使用非聚集索引

列经常被分组排序

返回某范围内的数据

不应

一个或极少不同值

不应

不应

小数目的不同值

不应

大数目的不同值

不应

频繁更新的列

不应

外键列

主键列

频繁修改索引列

不应

 

  事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。

 

哪些字段应该使用非聚集索引:

http://virusswb.blog.51cto.com/115214/984780

转载于:https://www.cnblogs.com/leonwcy/archive/2013/03/04/2943435.html

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