SQL优化篇

原创
05/16 06:18
阅读数 5

1优化SQL查询速度

1.1analyze表分析

        对表的索引等信息进行了增删改之后,需要对表进行analyze更新统计信息,才能使数据库做出最好的执行计划,有没有注意到,即使是一张很小的空表,如果进行了字段的增删改,也需要进行analyze,否则执行计划也会出错。

也就是说当前表的查询或其他性能不好时,可以先查看一下当前SQL的执行计划,观察SQL语句执行耗时情况以及是否有走索引,然后再针对耗时较多的表进行一次表分析以及索引情况的处理

语句如下:

Analyze table psn_client_potential compute statistics

1.2语句上做优化

(1)SELECT子句中避免使用"*"

SQL在解析的过程中, 会将"*" 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这就意味着将耗费很多的时间。

(2)避免使用HAVING子句, HAVING只会在检索出所有记录之后才对结果集进行过滤。这个处理需要排序、统计等操作。

(3)不要在where条件中使用左右两边都是%的like模糊查询,这样会导致数据库引擎放弃索引进行全表扫描,尽量使用右like查询。

(4)尽量不要使用in和not in,会造成全表扫描,对于连续的数值,能用between就不要用in,对于子查询,可以用exists代替。

    例句1:select name from table where num in(1,2,3)

  对于这种连续的数值,能用between就尽量不用in了,可以改成这样去查询:

       select name from table where num between 1 and 3

    例句2:select num from a where num in(select num from b),可以改成这样去查询:
       select num from a where exists(select 1 from b where num=a.num)

(5)尽量不要使用or,会造成全表扫描,可以用union代替or。

    例句:select name from table where num=10 or num=20,可以改成这样去查询:

     select name from table where num=10

     union all

     select name from table where num=20

(6)where条件里尽量不要进行null值的判断,null值的判断也会造成全表扫描,优化方法是给字段添加默认值,对默认值进行判断。

    例句:select name from table where num is null

    可以在num上设置默认值0,确保表中num列没有null值,然后查询语句改成这样:select name from table where num = 0

(7)尽量不要在where条件中等号的左侧进行表达式、函数的操作,这样写会导致全表扫描,优化方法是将表达式、函数操作移动到等号右侧。

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

2 索引是否越多越好

        索引并不是越多越好,索引固然可以提高相应select的效率,但同时也降低insert及update的效率,因为insert或update时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。

一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

以上内容只是本人学习过程简单整理~~,并不全面

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部