数据库SQL优化总结(续)

曾写过一篇《SQL调优与报表性能优化》的文章,今天结合那篇文章把前段时间工作中的一些认识和网上收集别人的经验重新总结整理一下,作为上一篇SQL优化的续篇,分享出来,希望对看到的人有所帮助。同时欢迎拍砖大笑

一、SQL优化的基本思想:

1、  最小化结果集数据量。

Sql所需处理的资源总量/Sql单位时间所能处理的资源量=Sql执行时间

所以为减少Sql执行时间:

(1)可以增大Sql单位时间所能处理的资源量。

(2)可以减少Sql所需处理的资源总量。

常见的是方法(2),即减少Sql所需处理的资源总量,就是减少执行sql所处理的行数。

2、  减少全表扫描。

减少全表扫描,主要手段就是建立索引,索引就好比一本书的目录,当你需要查询某篇文章时,不需要从头到尾把书的每页都查一遍,直接看目录就能找到了。

在没有建索引的情况下,从数据库查找某一条数据,就必须进行全表扫描,即对所有数据进行一次遍历。但即使在建立了索引的情况下,也会出现类似情况发生,因此要尽量避免全表扫描。

二、优化方法:

结合上面两点,总结如下:

1、  尽量减少对数据库的访问次数。

多次连接数据库会消耗大量时间,能用一句SQL查出来的尽量不要使用多个SQL查。

2、尽量把使用索引的列放在where条件首列。

3、不要过多地使用通配符*,而是使用查询列。

4、避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描。

考虑将null的列设置默认值0.

5、尽量避免在where子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

6、避免在where子句中使用or来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。

7、in和not in也要慎用,IN会使系统无法使用索引,而只能直接搜索表中的数据。

考虑使用between … and …

8、尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。

SELECT * FROM table1 WHERE col1 LIKE ‘%L%’

改为:

SELECT * FROM table1 WHERE col1 LIKE ‘L%’ 

9、尽量避免在 where 子句中对字段进行表达式操作,不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算

SELECT * FROM table1 WHERE col1/2=100 

10、在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

11、尽量把使用的索引放在选择的首列。

猜你喜欢

转载自shensy.iteye.com/blog/1887786