美文网首页
SQL性能优化十条经验

SQL性能优化十条经验

作者: 划船不用桨top | 来源:发表于2019-02-24 09:41 被阅读0次

    1.查询的模糊匹配

    尽量避免在一个复杂查询里面使用 LIKE '%parm1%'—— 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用.

    解决办法:

    其实只需要对该脚本略做改进,查询速度便会提高近百倍。改进方法如下:

    a、修改前台程序——把查询条件的供应商名称一栏由原来的文本输入改为下拉列表,用户模糊输入供应商名称时,直接在前台就帮忙定位到具体的供应商,这样在调用后台程序时,这列就可以直接用等于来关联了。

    b、直接修改后台——根据输入条件,先查出符合条件的供应商,并把相关记录保存在一个临时表里头,然后再用临时表去做复杂关联

    2.索引问题

    在做性能跟踪分析过程中,经常发现有不少后台程序的性能问题是因为缺少合适索引造成的,有些表甚至一个索引都没有。这种情况往往都是因为在设计表时,没去定义索引,而开发初期,由于表记录很少,索引创建与否,可能对性能没啥影响,开发人员因此也未多加重视。然一旦程序发布到生产环境,随着时间的推移,表记录越来越多

    这时缺少索引,对性能的影响便会越来越大了。

    这个问题需要数据库设计人员和开发人员共同关注

    法则:不要在建立的索引的数据列上进行下列操作:

    ◆避免对索引字段进行计算操作

    ◆避免在索引字段上使用not,<>,!=

    ◆避免在索引列上使用IS NULL和IS NOT NULL

    ◆避免在索引列上出现数据类型转换

    ◆避免在索引字段上使用函数

    ◆避免建立索引的列中使用空值。

    3.复杂操作

    部分UPDATE、SELECT 语句 写得很复杂(经常嵌套多级子查询)——可以考虑适当拆成几步,先生成一些临时数据表,再进行关联操作

    4. update

    同一个表的修改在一个过程里出现好几十次,如:

    update table1
    set col1=...
    where col2=...;
    update table1
    set col1=...
    where col2=...
    ......
    象这类脚本其实可以很简单就整合在一个UPDATE语句来完成(前些时候在协助xxx项目做性能问题分析时就发现存在这种情况)

    学生表 Student

    id(编号) name(名字) age(年龄) height(身高)
    1 Tommy 26 170
    2 Jerry 23 180
    3 Frank 30 160

    如表所示,这里只是呈现了3条数据,我们这里假设有1万条数据,

    查询年龄25岁以上,身高170以上的全部学生

    Select * from Student where age > 25 and height > 170;//正常情况下可以这么写,

    假设1:年龄在25岁以上的有8000个学生,而身高170以上的只有10个学生,

    上述的SQL的执行顺序和查询的行数应该是:

    1.先查询年龄25岁以上的学生,结果有8000条记录,

    2.再查询身高170以上的学生,就得在8000条结果里再次判断,最坏的可以遍历8000次左右,这效率较低

    假如更改上述SQL语句where条件字段的顺序,如下:

    Select * from Student where height > 170 and age > 25;
    
         那么结果将是:
    
          1.首先是查询出身高170以上的学生,结果只有10个;
    
          2.然后再在这10个结果中查询出年龄大于25岁的学生,这样遍历的次数一下子就减少了很多很多
    

    总结:所以,千万不要以为where语句中字段的顺序可以随便乱写,应该结合具体情况来安排好顺序,以使效率更高,

          当然,如果想效率进一步提高,应该在这两个字段上建立索引 (题外: 索引的建立以及 什么条件下索引才会被调用)

    相关文章

      网友评论

          本文标题:SQL性能优化十条经验

          本文链接:https://www.haomeiwen.com/subject/azolyqtx.html