1.FROM子句里的表
一般来说,把较小的表列在前面,把较大的表列在后面,就会获得更好的性能。
2.结合条件的次序
大多数结合使用一个基表链接到具有一个或多个共有字段的其他表,基表是主表
查询里的大多数或全部表都与它结合,通常,在WHERE子句里来自基表的字段一般
放到结合操作的右侧,要结合的表还是按照从小到大的次序排列。
3.最严格条件
最严格的条件就是:WHERE子句里返回最少记录的条件,与之相反,最宽松的条件就是
语句里返回最多记录的条件。
一般要把最严格的条件放在WHERE语句的末尾,从而让优化器首先读取它
下面举例说明:
WHERE LAST_NAME = 'SMITH';返回2000条记录
WHERE CITY = 'INDIANAPOLIS';返回3000条记录
那么,最严格的条件就是“WHERE LAST_NAME = 'SMITH'”
从实践总结出来的经验表明,最好使用具有索引的字段作为查询里的最严格条件,索引
通常会改善查询的性能。
4.全表扫描与索引
在没有索引时,就会发生全表扫描;
全表扫描一般比索引慢;
最简单的避免全表扫描的方式就是在WHERE子句里设置条件来过滤返回的数据;
全表扫描对于查询小型表或返回表里面大部分记录是高效的;
下面是应该被索引的数据:
作为主键的字段;
作为外键的字段;
在结合表里经常使用的字段;
经常在查询里作为条件的字段;
大部分唯一值得字段;
5.避免使用OR操作符
在SQL语句里用谓词IN代替OR操作符能够提高数据检索速度,下面举例说明:
SELECT EMP_ID
FROM EMPLOYEE_TBL
WHERE CITY = 'INDIANAPOLIS'
OR CITY = 'BROWNSBURG'
OR CITY = 'GREENFIELD'
下面是用一个查询,使用了IN:
SELECT EMP_ID
FROM EMPLOYEE_TBL
WHERE CITY IN('INDIANAPOLIS','BROWNSBURG','GREENFIELD')
这个连个SQL返回结果相同,测试发现,用IN代替OR后,检索数据的速度明显提高了。
6.避免使用HAVING子句
如果需要使用,最好尽可能地使其中的限制条件简单化。
7.避免大规模排序操作
使用ORDER BY,GROUP BY,HAVING等。
8.使用存储过程
可以为经常运行的SQL语句(特别是大型事务或查询)创建存储过程,所谓存储过程就是
经过编译的,以可执行格式永久保存在数据库里的SQL语句,以类似于数据库对象的形式管理。
9.在批量加载操作前后删除并重建索引是一个优点,同时可以减少索引碎片,批加载可能包含
数百,数千或数百万操作语句或事物。