zoukankan      html  css  js  c++  java
  • SQL之性能优化

    

    在实际应用中。数据库中的数据会有非常多。若要从这些数据表中检索数据,就须要对系统进行优化,提高数据库系统的响应速度,以下就是日常一些查询优化的方法。

     

     

    1.创建索引


    索引能够提高数据库查询的速度,提高数据库的訪问性能,但同一时候也会影响数据更新操作(比如插入、改动、删除)的速度。

    1. 假设WHERE子句中经经常使用到的某一列或者某几列创建索引

    2. 为数据表中常常须要运行排序操作的列创建索引

    3. 多表连接时。应该为数据表的连接列创建索引

    4. 对于须要不断更新的列,则不建议创建索引

     

     

    2.优化查询语句

    1. 避免在SELECT语句中使用“*

    2. 在使用SELECT语句时,应该在SELECT语句之后将要查询的信息一一列出来,即使要查询全部列的信息。也最好不要使用,从可读性上讲,方便用户对所要查询数据的理解。

    3. 调整WHERE子句中连接条件的顺序

      SQL语句查询中,使用最多的就应该是WHERE子句。连接条件顺序的不同也会影响数据的查询效率。

    比如:查询员工工资表中工资在10003000的员工记录


    语句一

    select empno,eName,salary
    from employee
    where salary>1000 
    and salary<3000

    语句二

    select empno,eName,salary
    from employee
    where salary<3000 
    and salary>1000


    我们看到这两条语句。查询的结果是全然同样的。可是查询效率确实不一样的,假设员工工资都在1000元以上的话,那么我们就不言而喻了,第二条语句直接就缩小了查询范文。

    注意:在使用WHERE子句进行查询时,要把限制性最高的查询条件放在最前面

     

    3.多表联合查询


    样例:

    select stuid,curid ,curName,result
    from t_result r,t_curriculum t
    where t.curid=t.curid --应该将表与表联合放在前面
    and t.stuid='123'
    

    注意:在多表连接时。应该将表与表的结合操作放在WHERE子句的前面。后面才是过滤语句


    4.避免使用ORkeyword


    匹配记录时。能够有两种方式,一种使用OR,还有一种使用In,使用Inkeyword能够提高数据的查询速度

    比如:

    select empno,eName
    from employee
    where eptno=10
    or eptno=15

    IN语句

    select empno,eName
    from employee
    where eptno in(10,15)--相当于创建了索引
    


    5.避免使用<>!=操作符


    比如:查询教师工资不为3000的教师记录

    这样的查询不是使用索引。而是直接查询数据库中的数据,应该用以下这样的形式

    select empno,eName,salary
    from employee
    where salary<3000
    or salary>3000 

    注意:在实际应用中。应该尽量使用<>等操作符而不是<>

    相关子查询中使用EXISTSkeyword取代INkeyword

    比如查询选修课程编号为105这门课的学生信息。


    6.EXISTSkeyword查询


    样例一:查询课程编号为105课程的信息


    EXISTS语句

    select s.stuid,s.stuName,s.age,s.sex
    from t_student s
    where exists 
    (select *
     from t_result t where 
     s.stuid=t.stuid and t.curid='t105')
    

    IN语句

    select s.stuid,s.stuName,s.age,s.sex
    from t_student s
    where s.stuid in
    (select *
     from t_result t where 
     s.stuid=t.stuid and t.curid='t105')


    原因:在运行带有INkeyword的子查询时。数据库会首先运行子查询操作,将查询结果放到一个暂时表中,主查询会在子查询运行完成后再运行。而带有EXISTSkeyword的相关子查询则是先检查主查询的第一条记录,通过子查询进行匹配。这个过程会重复运行,知道子查询所有检查完成。这样就节省了时间。


    7.使用LIKEkeyword


    使用LIKEkeyword实现模糊查询时。须要注意一下。

    比如查询学生编号中含有数字100的学生信息的两种方法


    方法一

    select stuid,stuName,age
     from t_student
     where stuid like '%100%'
    

    方法二

     select stuid,stuName,age
     from t_student
     where stuid like 's100%'
    


    注意:在实际应用中或许必需要实现第一种查询方法才干满足,这里仅仅是让大家知道这样会减少查询的效率。

     

    8.避免使用HAVING子句


    HAVING子句是用来对分组后的结果进行过滤,限制分组后的查询结果。在使用时一般须要运行排序,统计等功能。这就会消耗SQL额外工作。因此应该避免使用这些操作

    使用存储过程

    存储过程是经过编译的,永久保存在数据中的一组SQL语句。使用存储过程运行效率要比SQL语句运行效率高


    小结:以上仅仅是一部分SQL语句来改善数据库性能的方法,后面还会有相关的文章,敬请期待。

     

     

  • 相关阅读:
    hbase 相关
    java 连接 hiveserver2 例子
    ik_max_word ik_smart 区别 和 单字 查询 不到问题
    如何计算地址线和数据线
    golang consistent hash 菜鸟分析
    借助GitHub托管你的项目代码
    PHP性能追踪及分析工具xhprof的安装与使用
    git使用方法
    go开发
    go的websocket实现
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5089280.html
Copyright © 2011-2022 走看看