在做涉及到数据库的项目开发时,经常会遇到对sql语句进行优化的情况,对于数据量少的项目可能美什么感觉,但是一旦数据量多了起来,就会感觉到sql优化之后的明显变化。以下是自己总结的一些sql优化的方案。仅供参考。
目录
一、创建索引
1、尽量避免全表扫描,首先考虑在where 及 order by 涉及的列上建立索引
2、在经常需要进行检索的字段上创建索引
二、避免在索引上使用计算
在 where 条件中,避免直接对索引列进行计算(这会导致索引失效);
使用 in 和 exists 时,一般使用 exists ,因为 in 不走索引
like '%aaa%' 不走索引, like 'aa%' 走索引
三、使用预编译查询
使用参数化SQL ,预编译SQL语句,提高查询速度,防止sql注入。
四、调整Where 字句中的连接顺序
DBMS一般采用自下而上的顺序解析where字句,根据这个原理,表连接最好写在其他where连接之前,这样可以过滤掉最大数量记录,即在sql语句中,where 条件判断时,若涉及到多表,则先写表连接,在进行条件判断。
五、尽量将多条SQL语句压缩到一句SQL中
每次执行一条SQL语句的时候都要建立网络连接、进行权限校验,进行SQL语句的查询优化、发送执行结果,非常耗时,将多条SQL进行压缩可减少时间的消耗
六、用where字句替换having字句
避免使用having字句,因为having只会在检索出所有记录之后才对结果集进行过滤,而where是在聚合前筛选结果,能减少开销
七、使用表的别名
连接多个表时,使用表的别名并把别名前缀与每个列名上,可以减少解析时间和语法错误,在涉及到多表时,列名重复是很常见的事,所以在编写sql语句时,给数据表取一个别名,这样即好区分列的所属关系,又简化了sql语句的编写。
八、用union all 替换 union
union 和 union all 的性能差距很大,union 在对两个结果集进行合并的时候会去除重复行,对数据进行排序,而 union all 只是将两个结果集进行简单合并,在时间消耗上远远小于使用 union 的语句,在数据量小的时候可能感觉不少很深,但对大量数据来说,就会有很大的变化。
九、考虑使用“临时表”暂存中间结果
使用临时表暂存结果可以减少对主表的访问,直接查询临时表