避免扫描整个表

 大型数据库中的数据表的规模都比较大,如果每执行一条 SQL 语句都要在数据库中扫描一整张表,就会影响 SQL 语句的性能。比如,我们只是为了查找一条合适的记录而扫描一个规模相当大的,有几百万个记录的表,这就好像我们从头到尾读一本没有
目录的书去查找一个关键字一样,是非常没有效率的。 
      假如我们能够采取某种措施,为表中的一个合适的列建立索引,就可以尽量避免扫描表中的所有记录,提高了语句的执行效率。索引就象书本的目录一样,为我们缩小了查找的范围。而且一般情况下,访问索引的速度远比访问 数据库中表 的速度要快。在执行检索任务时,我们先查询索引,然后依据索引的结果再到表中调出相关记录,这样,就大大提高了我们对数据库的访问效率。 
索引的建立在本书前面的章节中有详细的介绍。索引的具体使用方式请读者参考第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 语句提高访问数据库的效率。 

转载于:https://my.oschina.net/javaEasy/blog/71879

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值