聚集索引和非聚集索引

Posted 布雷客·希

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聚集索引和非聚集索引相关的知识,希望对你有一定的参考价值。

一、聚集索引:

        一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。 

  聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。 
  
  聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。例如,如果应用程序执行 的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此 类查询的性能。同样,如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节 省成本。 
    当索引值唯一时,使用聚集索引查找特定的行也很有效率。例如,使用唯一雇员 ID 列 emp_id 查找特定雇员的最快速的方法,是在 emp_id 列上创建聚集索引或 PRIMARY KEY 约束。

 

     实例:比如日志表,有时间Time,逐渐Guid,日期Date(Time的日志部分)。   看似日期最符合聚集索引的要求,少量相同值、最多范围查询、统计最多,但由于往往需要排序、分页,所以聚集索引最好放在Time或者有序的Guid上(此时日期的统计和查询、删除依然很快,5KW秒级);

 

二、非聚集索引:

     一种索引,该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。

 

三、 使用方式:

动作描述 使用聚集索引 使用非聚集索引
列经常被分组排序
返回某范围内的数据 不应
一个或极少不同值 不应 不应
小数目的不同值 不应
大数目的不同值 不应
频繁更新的列 不应
外键列
主键列
频繁修改索引列 不应

 

四、索引扩展

  【覆盖查询】

    当索引包含查询引用的所有列时,它通常称为“覆盖查询”。 (一个索引有多列,并且覆盖查询条件的所有字段)

 

  【索引覆盖】

     如果返回的数据列就包含于索引的键值中,或者包含于索引的键值+聚集索引的键值中,那么就不会发生Bookup Lookup,因为找到索引项,就已经找到所需的数据了,没有必要再到数据行去找了。这种情况,叫做索引覆盖;

 

  【复合索引】

    和复合索引相对的就是单一索引了,就是索引只包含一个字段,所以复合索引就是包含两个或者多个字段的索引;

  

  【非键列】

    键列就是在索引中所包含的列,当然非键列就是该索引之外的列了;  

开文之前首先要讲讲几个概念

  【覆盖查询】

    当索引包含查询引用的所有列时,它通常称为“覆盖查询”。

 

  【索引覆盖】

     如果返回的数据列就包含于索引的键值中,或者包含于索引的键值+聚集索引的键值中,那么就不会发生Bookup Lookup,因为找到索引项,就已经找到所需的数据了,没有必要再到数据行去找了。这种情况,叫做索引覆盖;

 

  【复合索引】

    和复合索引相对的就是单一索引了,就是索引只包含一个字段,所以复合索引就是包含两个或者多个字段的索引;

  

  【非键列】

    键列就是在索引中所包含的列,当然非键列就是该索引之外的列了;   定义索引时,Include() 里面的字段;

 

以上是关于聚集索引和非聚集索引的主要内容,如果未能解决你的问题,请参考以下文章

聚集索引和非聚集索引有啥区别?

聚集索引和非聚集索引

SqlServer中创建非聚集索引和非聚集索引

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

MySQL中怎样创建聚集索引和非聚集索引,求创建这两种索引的SQL语句。谢谢

聚集和非聚集索引 - SQL Server 和 Oracle?