1.7.2 索引的创建、修改和删除
索引可以自动创建,也可以手工创建。如果在表的一个列或几个列上建立了主键约束或者唯一性约束,那么数据库服务器将自动在这些列上建立唯一性索引,这时索引的名字与约束的名字相同。
手工创建索引需要执行SQL命令,创建索引的命令是CREATE INDEX。一个用户可以在自己的模式中创建索引,只要这个用户具有CREATE INDEX这个系统权限。如果希望在其他用户的模式中创建索引,那么需要具有CREATE ANY INDEX这个系统权限。
CREATE INDEX命令的语法格式为:
CREATE INDEX索引名
ON表名(列1,列2……);
例如,如果要在表emp的empno列上建立索引,可以执行以下SQL语句:
SQL>CREATE INDEX idx_1
ON emp(empno);
在这个索引中,索引列只有一个,这样的索引称为单列索引。如果要建立复合索引,则要指定多个列。例如,下面的语句在表emp上创建了一个复合索引:
SQL>CREATE INDEX idx_2
ON emp(empno, deptno);
在默认情况下,创建的索引是非唯一的,也就是说,在表中的索引列上允许存在重复值。如果要创建唯一性索引,那么需要使用关键字UNIQUE。例如:
SQL>CREATE UNIQUE INDEX idx_3
ON emp(ename, deptno);
这时在表emp的ename和deptno列上创建了唯一性索引inx_3,这样可以保证表emp的ename和deptno列组合没有重复值,也就是说,没有两个员工名字相同,并且在同一个部门。
在创建一个索引时,需要指定一个或多个列,那么到底指定哪些列呢?一个重要原则是选择经常用在WHERE子句中使用的列。例如,如果要经常根据列empno的值查询员工的数据,那么可以考虑将列empno作为索引的索引列。
如果在查询时要在WHERE子句中指定多个查询条件,那么可以在涉及的多个列上分别创建索引。例如,对于条件WHERE A=7788 AND B>2000,可以在列A和列B上创建两个索引,但是在查询时也要涉及两个索引的查询。如果能够将两个索引合并为一个,那么查询的次数也会减少。如果在一个索引建立在两个或多个列上,这样的索引就是复合索引。复合索引主要用于多个条件的查询语句中。
一般情况下,在指定索引中的列时,要遵循以下原则:
·在WHERE子句中经常使用的列上创建索引。
·尽量不要在具有大量重复值的列上创建索引。
·具有唯一值的列是建立索引的最佳选择,但是究竟是否在这个列上建立索引,还要看是否对这个列经常进行查询。
·如果WHERE子句中的条件涉及多个列,可以考虑在这些列上创建一个复合索引。
正如前面所说,合理设计的索引将提高系统的性能,而不合理的索引反而会降低系统性能。所以,在数据库的运行过程中,要经常利用SQL Trace检查索引是否被使用,检查索引是否像期望的那样提高了数据库的性能。如果一个索引并没有被频繁地使用,或者一个索引对数据库性能的提高只有微小的帮助甚至没有帮助,这时可以考虑删除这个索引。