这块了解的不是很多,根据经验大致分sql查询和更新语句优化,设定索引优化,外部查询数据库Io优化等,下面大致介绍下:
1、查询语句优化
a、查询where条件优化,查询时候是按照从后到前进行,后面条件先执行,所以对大数据量过滤条件来说,应该放到最后面;多表联合查询,比如from a,b表也是按照从后到前顺序,先筛选b表,最后合并,一般把数据少表作为基础表效率更高;对应多表查询,一般把交叉表作为基础表效率高。 SELECT * FROM LOCATION L, CATEGORY C, EMP E
WHERE E.EMP_NO BETWEEN 1000 AND 2000
AND E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN;
将比下列SQL更有效率
SELECT * FROM EMP E, LOCATION L, CATEGORY C
WHERE E.CAT_NO = C.CAT_NO
AND E.LOCN = L.LOCN
AND E.EMP_NO BETWEEN 1000 AND 2000;
b、where条件尽量避免使用in not in <> or having等语句,可以使用 exist代替in。Having可以用where代替,如果无法代替可以分两步处理。
c、尽量避免模糊查询,可以把前台文本框改为选择框,这样使用精确定位
d、使用union all 代替 union,因为会将各查询子集的记录做比较,故比起UNION ALL ,通常速度都会慢上许多
e、索引字段尽量不要数值计算表达式,这样不会使用索引查询;不要以字符格式声明数字,要以数字格式声明字符值,否则索引无效
f、尽量避免distinct,orderby 等语句,这样会启动SQL引擎 执行,耗费资源的排序(SORT)功能
g、select语句尽量避免使用*,使用select a,b,c等精确查询
h、尽量避免使用嵌套查询,可以使用多表left join或from a,b where a.id=b.id and 查询解决
2、索引优化
数据库表在设计初期就应该考虑索引问题,否则当数据量增大,查询时效率会很低;使用索引的一些规则:对一些经常使用查询字段建立索引,排序字段、分组字段和外键,数据重复率不高的字段(重复率高字段建立索引查询效率不高),日期等格式不适合索引;
一些SQL的写法会限制索引的使用:1.where子句中如果使用in、or、like、!= <>,均会导致索引不能正常使用,将"<>"换成">and<";将"is not null "换成">=chr(0)";2.使用函数时,该列就不能使用索引。3.比较不匹配数据类型时,该索引将会被忽略。
3、外部访问数据库
外部系统访问数据库,尽量避免多次请求的查询的IO操作;因为每次访问都要内部执行了许多工作: 1、解析SQL语句2、估算索引的利用率3、绑定变量4、读数据块等等,所以如果可以把多次请求数据操作写成一个语句解决最好写成一个语句,尽量使用存储过程代替多次发送sql查询或更新
其他:更新数据时的优化,比如当删除数据时候,用truncate代替delete。