3.6.1 索引概述

3.6.1 索引概述

索引是根据表中的一列或若干列按照一定顺序建立的键值与记录行之间的对应关系表,是一个单独的、存储在磁盘上的数据库结构。类似于图书中的目录标注了各部分内容和所对应的页码,数据库中的索引注明了表中的索引行与其所对应的存储位置关系。数据页与索引页的对应关系如图3-26所示。

图3-26 数据页与索引页的对应关系

1)索引的作用

索引的概念涉及数据库中数据的物理存储顺序,因此属于数据库三级模式中的内模式。它具有如下优点。

①提高查询速度。在查询数据时,首先在索引中找到符合条件的索引值,再通过保存在索引中的位置信息找到相应的记录,从而可以实现快速查询,提高查询性能。这也是索引最主要的优点。

②强制实施唯一性约束。通过创建唯一索引还可以强制表中的行具有唯一性,从而确保数据的完整性。

③在外键上建立的索引还可以加快表与表之间的连接操作,有益于实现数据的参照完整性。

④通过使用索引可以在查询过程中使用优化隐藏器,提高系统的性能。

2)索引的类型

在SQL Server中,根据索引记录的结构和存储位置可分为聚集索引、非聚集索引、唯一索引、XML索引和全文索引等。其中聚集索引和非聚集索引是数据库中最基本的索引。

(1)聚集索引

聚集索引也称为聚簇索引,是指索引项的顺序与表中记录的物理存储顺序完全一致。由于聚集索引基于数据行的键值在表内排序和存储这些数据行,因此一个表只能建立一个聚集索引。在SQL Server中,系统会自动在有主键约束(PRIMARY KEY)的列上创建聚集索引。

在SQL Server中,索引按B树结构组织,索引B树中的每一页称为一个索引节点。B树的顶端节点称为根节点,索引中的底层节点称为叶节点,根节点和叶节点之间的任何索引级别统称为中间级。在聚集索引中,叶节点包含基础表的数据页,根节点和中间级节点包含存有索引行的索引页。每个索引行包含一个键值(也称索引码)和一个指针,该指针指向B树上的某一中间级页或叶级索引中的某个数据行。每级索引中的页均被链接在双向链接列表中。聚集索引结构如图3-27所示。

图3-27 聚集索引结构

(2)非聚集索引

非聚集索引与聚集索引具有相同的B树结构,二者之间的显著差别在于:

①基本表的数据行不按非聚集键的顺序排序和存储;

②非聚集索引的叶节点是由索引页而不是数据页组成。由于非聚集索引不影响数据行的物理存储顺序,即数据库行的物理存储顺序与索引键的逻辑(索引)顺序并不一致,所以每个表可以有多个非聚集索引,最多不超过999个。非聚集索引结构如图3-28所示。

图3-28 非聚集索引结构

如果基本表中包含一个非聚集索引但没有聚集索引,这时候如果往表中插入一条记录,则这条记录将会被插入到基本表的最后一行,然后非聚集索引会被更新。如果该基本表中还包含聚集索引,则先根据聚集索引确定新数据的位置,然后再更新聚集索引和非聚集索引。

(3)唯一索引

唯一索引能保证索引键中不包含重复的值,从而使表中的每一行在某种方式上具有唯一性。例如,如果要确保课程表Course中课程名称Cname列的值是唯一的,当主码是课程号Cno时,对Cname列创建唯一索引,这样当用户尝试在该列中为多门课程输入相同的课程名称时,将显示错误信息并且不能输入重复的值。基于多列创建唯一索引,能够保证索引键中值的每个组合都是唯一的,即表中的任意两行都不会有这些列值的相同组合。

聚集索引肯定是唯一的,非聚集索引也可以是唯一的。只要列中的数据是唯一的,就可以为同一个表创建一个唯一聚集索引和多个唯一非聚集索引。在SQL Server中,系统会自动在有唯一性约束(UNIQUE)的列上创建唯一索引。

(4)XML索引

XML索引是为XML数据类型列创建的索引,它们对列中XML实例的所有标记、值和路径进行索引,从而提高查询性能。若需经常对XML列进行查询,或XML值相对较大,但检索的部分相对较小,则可以考虑创建XML索引。XML索引分为主XML索引和辅助XML索引。

(5)全文索引

全文索引是一种特殊类型的基于标记的功能性索引,由SQL Server全文引擎生成和维护,用于帮助用户在字符串数据中搜索复杂的词语。

3)创建索引的准则

虽然使用索引可以提高系统性能,但是索引设计不合理或缺失索引或索引过多都会影响系统的性能,因此设计索引时应考虑以下准则:

索引并非越多越好,因为存储索引需要占用一定的物理存储空间,此外大量索引也会影响INSERT、UPDATE、DELETE等语句的性能,当表中的数据更改时,所有索引都须适当调整;

避免对经常更新的表进行过多的索引,并且索引中的列要尽可能少;

如果表的数据量比较大且更新操作少,则可以创建多个索引来提高性能;

如果表的数据量比较小,则最好不要创建索引,因为数据较少,全表扫描花费的时间可能比遍历索引的时间还要短。因此,小表的索引可能从来不用,但仍必须在表中的数据更改时进行维护;

视图包含聚合、表连接或聚合和连接的组合时,在视图上创建索引可以显著提升性能;

可以使用数据库引擎优化顾问来分析数据库并生成索引建议;

可以考虑在经常用于查询中的谓词和连接条件的列上创建非聚集索引;

建议定义聚集索引时使用的列越少越好,且频繁更改的列不适合建立聚集索引;

如果索引包含多个列,则应考虑列的顺序。