索引的作用(索引的作用是什么)

6.2 索引

本节介绍索引的作用以及如何创建和维护索引。

6.2.1 索引的基本概念

在数据库中建立索引是为了加快数据的查询速度。数据库中的索引与书籍中的目录或术语表类似。在一本书中,利用目录或术语表可以帮助读者快速找到所需内容,而无须翻阅整本书。在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。书籍中的术语表是一个词语列表,其中注明了各个词对应的页码。而数据库中的索引是一个表中某列或某些列的值列表,其中注明了列值所对应的行数据所在的存储位置。可以为表中的单个列建立索引,也可以为一组列建立索引。索引由索引项组成,索引项由表中的一列或多列(称为索引关键字)组成。索引常用的数据结构是B树结构,B树按索引关键字排序。

6.2.2 索引的分类

从数据的组织方式看,一般将索引分为两大类:聚集索引(clustered index,也称为聚簇索引)和非聚集索引(non-clustered index,也称为非聚簇索引)。聚集索引对数据按索引关键字进行物理排序,非聚集索引不对数据进行物理排序。在SQL Server中,聚集索引和非聚集索引都采用B树结构来存储索引项,都包含数据页和索引页(索引也以数据页为存储分配单位),其中索引页用于存放索引项和指向下一层的指针,数据页用于存放数据。

1. 聚集索引

建立聚集索引后,数据库管理系统会自动将表中的数据按聚集索引关键字的值进行物理排序,可以是升序也可以是降序。因此建立聚集索引后,存储在磁盘上的表数据一定是有序的。

索引并不是建立得越多越好(建立索引需要占用空间,维护索引需要耗费时间),而是要有一些考虑因素。

下列情况可考虑创建聚集索引:

(1)包含大量非重复值的列。

(2)使用下列运算符返回一个范围值的查询:BETWEEN AND、>、>=、< 和 <=。

(3)经常被用于进行连接操作的列。

(4)ORDER BY或GROUP BY子句使用的列。

下列情况不适于建立聚集索引:

(1)频繁更改的列。因为这将导致索引项的整行移动。

(2)字节长的列。因为聚集索引的索引项值将被所有非聚集索引作为查找关键字使用,并被存储在每个非聚集索引的叶级索引项中。

2. 非聚集索引

非聚集索引与图书后边的术语表类似。数据存储在一个地方,术语表存储在另一个地方。而且数据并不按术语表的顺序存放,但术语表中的每个词在书中都有确切的位置。非聚集索引就类似于术语表,而数据就类似于一本书的内容。

非聚集索引与聚集索引一样,通常采用B树结构存储,但有两个重要差别:

(1)非聚集索引的数据不按索引关键字值的顺序排序和存储。

(2)非聚集索引的叶节点不是存放数据的数据页。

下述情况可考虑创建非聚集索引:

(1)包含大量非重复值的列。如果某列只有很少的非重复值,如只有1和0,则不对这样的列建立非聚集索引。

(2)不返回大型结果集的查询。

(3)经常作为查询条件使用的列。

(4)经常作为连接和分组条件的列。

3. 唯一索引

唯一索引可以确保索引列不包含重复的值。在由多个列共同构成的唯一索引中,该索引可以确保索引列中每个值的组合都是唯一的。例如,如果在LastName和FirstName列的组合上创建了一个唯一索引FullName,则该表中任何两个人都不可以具有完全相同的名字(LastName和FirstName均相同)。

聚集索引和非聚集索引都可以是唯一的。因此,只要列中的数据是唯一的,就可以在一张表上创建一个唯一聚集索引和多个唯一非聚集索引。

6.2.3 创建和删除索引

1. 创建索引

创建索引使用的是CREATE INDEX 语句,其一般语法格式为:

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]

 INDEX 索引名 ON 表名 ( 列名[ ASC | DESC ] [,...n] )

其中:

● UNIQUE:表示要创建唯一索引。

● CLUSTERED:表示要创建聚集索引。

● NONCLUSTERED:表示要创建非聚集索引。

● [ ASC | DESC ]:指定索引列的升序或降序排序方式。默认值为ASC。

如果没有指定索引类型,则默认是创建非聚集索引。

例1. 在Student表的Sname列上创建一个非聚集索引。

CREATE INDEX Sname_ind

 ON Student (Sname)

例2. 在Student表的Sid列上创建一个唯一非聚集索引。

CREATE UNIQUE NONCLUSTERED INDEX Sid_ind

 ON Student (Sid)

例3. 在Employee表的FirstName和LastName列上创建一个聚集索引。

CREATE CLUSTERED INDEX EName_ind

 ON Employee (FirstName, LastName)

2. 删除索引

索引一经建立,就由数据库管理系统自动使用和维护,不需要用户干预。建立索引是为了加快数据的查询效率,但如果需要频繁地对数据进行增加、删除和修改操作,则系统会花费很多时间来维护索引,这会降低数据的修改效率;另外,存储索引需要占用额外的空间,这增加了数据库的空间开销。因此,当不需要某个索引时,应将其删除。

删除索引的SQL语句是DROP INDEX,其一般语法格式为:

DROP INDEX <索引名> ON <表名>

其中<表名>为包含要删除索引的表。

例4. 删除Student表中的Sname_ind索引。

DROP INDEX Sname_ind ON Student