目录的书去查找一个关键字一样,是非常没有效率的。
假如我们能够采取某种措施,为表中的一个合适的列建立索引,就可以尽量避免扫描表中的所有记录,提高了语句的执行效率。索引就象书本的目录一样,为我们缩小了查找的范围。而且一般情况下,访问索引的速度远比访问 数据库中表 的速度要快。在执行检索任务时,我们先查询索引,然后依据索引的结果再到表中调出相关记录,这样,就大大提高了我们对数据库的访问效率。
索引的建立在本书前面的章节中有详细的介绍。索引的具体使用方式请读者参考第3 章“创建数据库”的第五小节的内容,本节只是举一些简单的例子来说明使用索引如何避免扫描整张表(表 Employee 见附录 I):
SELECT name, sex, id, salary
FROM Employee
Results
name sex id salary
———— —— —— ————
林志千 男 1001 6000.00
李明 男 1002 5000.00
李大平 男 1003 3000.00
林国荣 男 1004 4000.00
庞文凯 男 1005 3000.00
陈广海 男 2001 5000.00
刘燕 女 2002 3000.00
林志祥 男 2003 3000.00
张宇 男 3001 5000.00
吴忠彦 男 3002 3000.00
魏箐 女 3003 4000.00
王静 女 3004 3000.00
张峰 男 4001 7000.00
张敏燕 女 4002 4000.00
魏华翔 男 4003 6000.00
王亚鹏 男 4004 6000.00
林雪飞 女 4005 4000.00
姜艳成 女 4006 4000.00
李志深 男 5001 5000.00
梁朝阳 男 5002 3000.00
王力刚 男 5003 3000.00
余文惠 女 5004 4000.00
魏成 男 6001 5000.00
陈志强 男 6002 4000.00
[24rows]
上面是表 Employee 中的所有记录的部分列。如果我们没有建立任何索引,并且运
行如下的 SQL 语句:
SELECT name, sex, id, salary
FROM Employee
WHERE id > 5000 AND id < 6000
该语句 SELECT 表 Employee 中的在部门号为 5 的部门工作的员工的记录。这条语句的实现过程是逐条读取表中的记录,将记录中 id 列的值与 5000 和 6000 进行比较,直到符合条件为止。因为事先不知道符合条件的记录有多少条,所以这条语句将扫描整个
表,直到找出所有符合条件的记录。 如果我们使用了索引,效率就可以大大提高:
CREATE INDEX id_index
ON Employee(id)
我们在 id 列上建立了索引,再运行上面的 SELECT 语句时,索引 id_index 先被访问,因为不需要从数据库中读取表的数据,对 id_index 的访问非常快。然后我们再通过访问索引的结果来直接读取表中那些符合条件的记录:
Results
name sex id salary
———— ——— —— ————
李志深 男 5001 5000.00
梁朝阳 男 5002 3000.00
王力刚 男 5003 3000.00
余文惠 女 5004 4000.00
[4rows]
因为只需要在表中读取这 4 条记录,所以该语句的执行效率得到很大提高,表的规模越大,效率提高得就越明显。
有时,虽然建立了索引,但是并不能象我们所期待的那样,能明显提高语句的执行效率。例如, SQL 语句需要操作的对象就是整张表的绝大部分或者是所有记录,又或者,表的规模很小。这两种情况下,建立索引,然后每次都参照索引来访问记录反而降低了
语句的执行效率。只有在大表中的合适的列上建立索引,而要访问的记录只是表的一小部分时,索引才能最好地 SQL 语句提高访问数据库的效率。