零基础学SQL
上QQ阅读APP看书,第一时间看更新

4.4 使用索引

在实际应用中,为了加快查询的效率,都会为数据表创建适当的索引。索引就是一个指向数据表中数据的指针。通过为数据表建立适当的索引可以提高SQL语句对数据表的访问速度。这一节就来介绍如何在数据库中使用SQL语句创建和删除索引,有关优化索引的内容可以参看26.1节。

4.4.1 索引的分类

索引主要可以分为唯一索引、主索引、单列索引、复合索引以及聚簇索引等,下面分别来介绍一下这几种索引。

❑唯一索引:在数据表中使用UNIQUE关键字可以为一个数据列定义一个唯一索引。唯一索引中每一个索引值只对应数据表中的一条记录,它保证了数据列中记录的唯一性。如果在向数据表中插入一条记录时,数据库会对要插入的这条记录进行检查,如果发现该条记录中的值在定义了唯一索引的列中出现过,那么数据库管理系统就不会将这条记录插入到数据表中。一般在为列创建唯一约束后,数据库会为该列建立一个唯一索引,其索引名与约束名是相同的。

❑主索引:在数据表中使用PRIMARY KEY关键字可以为一个数据列定义一个主索引。所谓主索引,就是在定义的主键列中创建的索引。主索引也保证了数据列中记录的唯一性。一般在为列创建主键约束后,数据库会为该列建立一个主索引,其索引名与约束名是相同的。

❑单列索引:定义在数据表中一个数据列上的索引就是单列索引。一般在数据查询时,如果WHERE子句中经常用到数据表中的某一列作为查询条件,为了提高查询的效率,可以为该列创建单列索引。

❑复合索引:索引可以定义在一个数据表的多个数据列上,像这样的索引被称为复合索引。一般在数据查询时,如果WHERE子句中经常用到数据表中的某几个列作为查询条件,为了提高查询的效率,可以为这多个列创建复合索引。

❑聚簇索引:为了提高SQL语句对数据表的查询效率,可以为数据表创建一个聚簇索引。聚簇索引中索引项的顺序与数据表中数据记录的物理顺序保持一致。聚簇索引在每一个数据表中只能创建一个。

注意 在数据表中,既可以在单列上创建索引,也可以在多列上创建索引。同一张数据表中也可以建立多个索引。一般数据库中对一张数据表中创建的索引数量给予限制。例如在MySQL数据库中,同一张数据表创建的索引总数不能超过16个;在Oracle数据库中,如果要创建复合索引,则索引列的总数不能超过32个。

4.4.2 创建与删除索引

在数据表中,创建和删除索引一般是由数据库管理员或者是数据表的创建者来完成的。如果想创建索引,可以使用CREATE INDEX语句完成。创建索引的语法格式如下:

        CREATE [UNIQUE]|[CLUSTER]INDEX索引名
        ON表名(列名 [排序方式]...)

其中,关键字UNIQUE表示创建的索引是唯一索引;关键字CLUSTER表示创建的索引是聚簇索引;这两个索引是可选的。关键字INDEX后面跟的是要创建的索引的名字;关键字ON用来指定索引要创建在哪一张数据表的哪一个或者哪几个列中;关键字ON后面跟的是数据表的名字;表名后面的括号里是用来指定索引要定义在哪一个或者哪几个列中;排序方式表示指定建立索引的排序是升序还是降序排列,关键字ASC表示升序排序,关键字DESC表示降序排序,默认情况下是升序排序。列名后面的排序方式是可选的。

例4.7 为教师信息表中表示教师职称单列创建索引。

        CREATE INDEX i_profession
        ON T_teacher(profession)

这段SQL语句是为教师信息表中教师职称的列profession创建索引。其中,i_profession表示索引的名字;T_teacher(profession)表示要为教师信息表T_teacher的列profession创建索引。

选中MySQL 5.0用户图形界面的右侧Schemata选项下的test_STInfo数据库中的教师信息表T_teacher,单击鼠标右键,在出现的列表中选择“Edit Tabel”选项,在出现的表编辑对话框中,选择对话框下方的“Indices”选项卡,可以看到为教师信息表T_teacher中列profession创建的索引信息,如图4.7所示。

图4.7 单列索引信息

在图4.7中,“Indices”选项卡下描述了对教师信息表T_teacher中列profession创建的单列索引信息。在“Index Settings”选项下指定了数据表T_teacher中单列约束的信息。其中,“Index Name”指定了索引的名字,“Index Kind”指定了索引的类型,这里的索引类型设定为“INDEX”,“Index Type”指定了索引类型;在界面的右下方空白处,在Index Columns选项下指定了唯一索引的列名为profession。

在数据表中,除了可以为数据表中的某一列创建单列索引外,也可以为数据表的多个列创建复合索引。例如下面这个例子。

例4.8 为教师信息表中表示教师所在院系的列和教师职称的列创建复合索引。

        CREATE INDEX i_dept_profession
        ON T_teacher(dept,profession)

这段SQL语句是为教师信息表中教师所在院系的列和教师职称的列创建复合索引。其中, i_dept_profession表示索引的名字;T_teacher (dept, profession)表示要为教师信息表T_teacher的列dept和列profession创建索引。列dept表示教师所在的院系,列profession表示教师职称。

选中MySQL 5.0用户图形界面的右侧Schemata选项下的test_STInfo数据库中的教师信息表T_teacher,单击鼠标右键,在出现的列表中选择“Edit Tabel”选项,在出现的表编辑对话框中,选择对话框下方的“Indices”选项卡,可以看到为教师信息表T_teacher中列dept和列profession创建的复合索引的信息,如图4.8所示。

在图4.8中,“Indices”选项卡下描述了对教师信息表T_teacher中列dept和列profession创建的复合索引信息。在“Index Settings”选项下指定了数据表T_teacher中复合列索引的信息。其中,“Index Name”指定了索引的名字,“Index Kind”指定了索引的类型,这里的索引类型设定为“INDEX”,“Index Type”指定了索引类型;在界面的右下方空白处,在Index Columns选项下指定了复合索引的列名,分别为dept和profession。

图4.8 复合索引信息

当然,在为数据表中的列创建索引时,也可以在列名的后面指定索引值的排序方式。例如,现在要为表示教师的工资字段创建一个索引,并且让索引只按照升序的方式排序,其SQL语句就可以使用如下的写法完成。

        CREATE INDEX i_salary
        ON T_teacher(salary ASC)

上面的两个例子中,分别在数据表中创建了单列索引和复合索引,当然也可以使用创建索引的语法格式中的UNIQUE和CLUSTER关键字为数据表创建唯一索引和聚簇索引。根据上面讲到的例子,读者很容易地就可以创建出唯一索引和聚簇索引。这里就不再举例了。

删除索引很简单,使用DROP INDEX语句就可以将一个索引删除。索引删除的同时,数据库管理系统会将数据字典中有关该索引的描述一并删除。删除索引的语法格式如下:

        DROP INDEX 索引名

例如,现在想把教师信息表(T_teacher)中为列教师职称创建的索引删除,就可以使用DROP INDEX来完成。

例4.9 删除教师信息表中为列教师职称创建的索引。

        DROP INDEX i_profession

其中,i_profession表示索引的名字。

注意 创建和删除索引一般是由数据库管理员或者是数据表的创建者来完成的。一般其他用户不能创建和删除索引,如果用户希望在数据表中创建和删除索引,必须要取得相应的管理权限。有关数据表中的权限授予的内容可以参看第15章。