参考:
http://www.cnblogs.com/kissdodog/archive/2013/06/12/3132380.html
http://www.cr173.com/html/17298_1.html
http://jingyan.baidu.com/article/e73e26c0f1e82d24acb6a75d.html

一.聚集索引

(1)特点:
聚集索引对于任意给定的表而言是唯一的,一个表只能有一个聚集索引。不一定非要有聚集索引。聚集索引特殊的方面是:聚集索引的叶级是实际的数据-也就是说,数据重新排序,按照和聚集索引排序条件声明的相同物理顺序存储。这意味着,一旦到达索引的叶级,就到达了数据。而非聚集索引,到达了叶级只是找到了数据的引用。

  任何新记录都根据聚集列正确的物理顺序插入到聚集索引中。创建新页的方式随需要插入记录的位置而变化。如果新记录需要插入到索引结构中间,就会发生正常的页拆分。来自旧页的后一半记录被移到新页,并且在适当的时候,将新记录插入到新页或旧页。如果新记录在逻辑上位于索引结构的末端,那么创建新页,但是只将新记录添加到新页。

对于聚集索引,叶节点即存储了数据行,不再有单独的数据页。就比如说我小时候查字典从来不看目录,我觉得字典本身就是一个目录,比如查裴字,只需要翻到p字母开头的,再按顺序找到e。通过这个方法我每次都能最快的查到老师说的那个字,得到老师的表扬。
(2)适用场景:
定义聚集索引键时使用的列越少越好。
• 包含大量非重复值的列。
.• 使用下列运算符返回一个范围值的查询:BETWEEN、>、>=、< 和 <=。
• 被连续访问的列。
• 回大型结果集的查询。
• 经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说,这些是外键列。对 ORDER BY 或 GROUP BY 子句中指定的列进行索引,可以使 SQL Server 不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。
• OLTP 类型的应用程序,这些程序要求进行非常快速的单行查找(一般通过主键)。应在主键上创建聚集索引。

(3)不适用场景
• 频繁更改的列 。这将导致整行移动(因为 SQL Server 必须按物理顺序保留行中的数据值)。这一点要特别注意,因为在大数据量事务处理系统中数据是易失的。
• 宽键 。来自聚集索引的键值由所有非聚集索引作为查找键使用,因此存储在每个非聚集索引的叶条目内。

二.非聚集索引

(1)特点:
表中行的物理顺序与索引顺序无关。对于非聚集索引,叶节点存储了索引字段值以及指向相应数据页的指针。叶节点紧邻在数据之上,对数据页的每一行都有相应的索引行与之对应。有时候查字典,我并不知道这个字读什么,那我就不得不通过字典目录的“部首”来查找了。这时候我会发现,目录中的排序和实际正文的排序是不一样的,这对我来说很苦恼,因为我不能比别人快了,我需要先再目录中找到这个字,再根据页数去找到正文中的字。

(2)聚集索引和非聚集索引
聚集索引表示表中存储的数据按照索引的顺序存储,检索效率比非聚集索引高,但对数据更新影响较大。非聚集索引表示数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置,非聚集索引检索效率比聚集索引低,但对数据更新影响较小。

三. 索引的优缺点

其实通过前面的介绍,索引的优缺点已经一目了然。
先说优点:
(1)大大加快数据的检索速度,这也是创建索引的最主要的原因
(2)加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
(3)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

再说缺点:
(1)创建索引需要耗费一定的时间,但是问题不大,一般索引只要build一次
(2)索引需要占用物理空间,特别是聚集索引,需要较大的空间
(3)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度,这个是比较大的问题。

四.索引的使用

根据上文的分析,我们大致对什么时候使用索引有了自己的想法(如果你没有,回头再看一遍。。。)。一般我们需要在这些列上建立索引:
(1)在经常需要搜索的列上,这是毋庸置疑的;
(2)经常同时对多列进行查询,且每列都含有重复值可以建立组合索引,组合索引尽量要使常用查询形成索引覆盖(查询中包含的所需字段皆包含于一个索引中,我们只需要搜索索引页即可完成查询)。 同时,该组合索引的前导列一定要是使用最频繁的列。对于前导列的问题,在后面sqlite的索引使用介绍中还会做讨论。
(3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度,连接条件要充分考虑带有索引的表。
(4)在经常需要对范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的,同样,在经常需要排序的列上最好也创建索引。
(5)在经常放到where子句中的列上面创建索引,加快条件的判断速度。要注意的是where字句中对列的任何操作(如计算表达式,函数)都需要对表进行整表搜索,而没有使用该列的索引。所以查询时尽量把操作移到等号右边。

对于以下的列我们不应该创建索引:
1)很少在查询中使用的列
2)含有很少非重复数据值的列,比如只有0,1,这时候扫描整表通常会更有效
3)对于定义为TEXT,IMAGE的数据不应该创建索引。这些字段长度不固定,或许很长,或许为空。
当然,对于更新操作远大于查询操作时,不建立索引。也可以考虑在大规模的更新操作前drop索引,之后重新创建,不过这就需要把创建索引对资源的消耗考虑在内。总之,使用索引需要平衡投入与产出,找到一个产出最好的点。

SQL Server聚集索引和非聚集索引相关推荐

  1. sql查询初学者指南_面向初学者SQL Server查询执行计划–非聚集索引运算符

    sql查询初学者指南 Now that we understand what Clustered Index Scan and Clustered Index Seek are, how they o ...

  2. SQL Server临界点游戏——为什么非聚集索引被忽略!

    当我们进行SQL Server问题处理的时候,有时候会发现一个很有意思的现象:SQL Server完全忽略现有定义好的非聚集索引,直接使用表扫描来获取数据.我们来看看下面的表和索引定义: 1 CREA ...

  3. sql聚集索引和非聚集索引_SQL Server中非聚集索引概述

    sql聚集索引和非聚集索引 This article gives an introduction of the non-clustered index in SQL Server using exam ...

  4. 面向初学者的 SQL Server 查询执行计划(1)——聚集索引运算符(Clustered Index)

    在本文中,我们将讨论与聚集索引相关的各种执行计划运算符,以及它们的作用.它们何时出现以及它们何时出现. 执行计划中的每一个运算符都会提供一些有关 SQL Server 运行方式的指标. 我们需要理解这 ...

  5. [转]SQL Server 索引基础知识(2)----聚集索引,非聚集索引

    SQL Server 索引基础知识(2)----聚集索引,非聚集索引 [来自]http://blog.joycode.com/ghj/archive/2008/01/02/113291.aspx 由于 ...

  6. SQL Server的聚集索引和非聚集索引

    微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引)-- (一) ...

  7. [转]聚集索引和非聚集索引(sql server索引结构及其使用)

    聚集索引和非聚集索引(sql server索引结构及其使用) [来自]http://www.cnblogs.com/xinqqing83/archive/2006/10/31/545747.html ...

  8. SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引

    我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我 ...

  9. SQL Server 深入解析索引存储(非聚集索引)

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...

  10. SQL Server索引概要(3)-聚集索引和非聚集索引的区别

    索引用于加速 SQL Server 中的查询过程,从而提高性能.它们类似于教科书索引.在教科书中,如果您需要转到特定章节,请转到索引,找到该章节的页码并直接转到该页面.如果没有索引,查找所需章节的过程 ...

最新文章

  1. Mac OS Sierra安装Imagick
  2. 理论修炼之ETCD,高一致性Key-Value服务提供者中的佼佼者
  3. 共享马扎的火爆,原来是一场营销!
  4. 【数据库】Mysql的REPLACE()函数替换字符串
  5. threading模块的使用
  6. 服务器系统bsd,BSD操作系统大盘点:其它BSD变体
  7. Hibernate--Criteria Query and DetachedCriteria
  8. 教师计算机专业知识考试试题及答案,信息技术学科教师基本功测试题及答案
  9. docker基础4--docker的命令
  10. 一对一直播app源码开发的前端实现
  11. 鸿蒙生死印作用,逆天邪神:南溟神帝要抢鸿蒙生死印已成事实,但他还有更大作用...
  12. 计算机网络基础课后习题,《计算机网络技术基础》课后习题参考答案
  13. webrtc入门:13.pion webrtc开源的webrtc框架
  14. 计网复习——传输层习题
  15. 以图搜图(一):python aHash算法
  16. (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  17. 一句话木马的工作原理
  18. C语言/Python经典算法冒泡排序
  19. 午夜00:37分,与蚊子相伴无眠之夜
  20. 08年总结评述(一)

热门文章

  1. 刷机简单教程,双清及错误解决细节
  2. 神州信息喜获信创服务15个软件著作权证书
  3. SpringBoot前端模板
  4. linux云计算基础(云计算的介绍)
  5. 基于CSS3和jQuery的相片墙——ImageWall~~源码来咯
  6. Flutter自定义圆形选择框
  7. 在北京大学2008年开学典礼上的发言 ------英语系80级 俞敏洪 zt
  8. 如何用gitee的pull request交作业?网页端5步轻松完成
  9. 11月8日赢在淘宝 北京站ISV聚会笔记
  10. 车型数据2019年12月(品牌、车系、车辆信息)