zoukankan      html  css  js  c++  java
  • SQL语句及数据库优化

     1,统一SQL语句的写法

    对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器认为是不同的。 所以封装成复用方法,用标准模板来控制。

    select*from dual 
    select*From dual
    其实就是大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析。生成2个执行计划
     

    2,不要把SQL语句写得太复杂

    我经常看到,从数据库中捕捉到的一条SQL语句打印出来有2张A4纸这么长。一般来说这么复杂的语句通常都是有问题的。我拿着这2页长的SQL语句去请教原作者,结果他说时间太长,他一时也看不懂了。可想而知,连原作者都有可能看糊涂的SQL语句,数据库也一样会看糊涂。
     
    比如 Select语句的结果作为子集
    简化SQL语句的重要方法就是采用临时表暂存中间结果,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表 也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。
     

    3,必须采用绑定变量 

    select*from orderheader where changetime >‘2010-10-20 00:00:01‘ 
    select*from orderheader where changetime >‘2010-09-22 00:00:01‘

    以上两句语句,查询优化器认为是不同的SQL语句,需要解析两次。如果采用绑定变量

    select*from orderheader where changetime >@chgtime
     

    4,使用like进行模糊查询时应注意

    有的时候会需要进行一些模糊查询比如

    select*from contact where username like ‘%yue%’
     关键词%yue%,由于yue前面用到了“%”,因此该查询必然走全表扫描,除非必要,否则不要在关键词前加%,
     
    5,联表查询

    (1)    连接字段尽量选择聚集索引所在的字段

    (2)    仔细考虑where条件,尽量减小A、B表的结果集
     获取下载地址  springmvc+mybatis+spring 整合 bootstrap html5
    6,索引,
    看sql 的性能,主要看执行计划,还有cpu成本,io成本等。这里就以一个简单的表为例。
    首先,创建一个简单的表,一般会先建个主键,系统自动以主键建聚集索引。
    判断是否需要优化sql的一个简单规则是:看执行计划中的操作是seek(搜索)还是scan(扫描)
    是scan的话就要索引。
     
    使用场景:
    当一个系统查询比较频繁,而新建,修改等操作比较少时,可以创建覆盖索引,将查询字段和where子句里的字段全部包含在内,这样查询的速度会比以前快很多,同时也带来弊端,就是新建或修改等操作时,比没有索引或没有建立覆盖索引时的要慢。读写数据库分离也能解决问题
     
    经常对Creator_Id字段查询,就做个索引。
    对表Article的Creator_Id字段建索引
    CREATE INDEX Ix_article_creatorid ON Article(Creator_Id)
    set statistics io 和 set statistics,这是性能调优时查看相关cpu占用时间,IO资源数据的两个比较重要的命令
     
    记得Order by 语句加索引
     
    7,读写分离
     
    当主数据库进行写操作时,数据要同步到从的数据库,这样才能有效保证数据库完整性
    主从分离,对数据库层面就是数据同步或者是数据复制;从应用层讲就是请求的分离:增删改请求主库,查询请求从库
     
    8,尽量不用select * from …..
     
    ,而要写字段名 select field1,field2,…这条没什么好说的,主要是按需查询,不要返回不必要的列和行。
     
    9 任何对列的操作都将导致表扫描,
    它包括数据库函数、计算表达式等,查询时要尽可能将操作移至等号右边
    10 In 、or子句常会使索引失效
    显而易见的,IN,OR扩大的查询范围。
    11通常情况下,连接比子查询效率要高
    必然的,需要子查询时,也是用临时表暂存中间结果
  • 相关阅读:
    Learning Spark中文版--第三章--RDD编程(1)
    关于learning Spark中文版翻译
    dom4j 常用操作
    Invalid bound statement (not found)
    touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied
    docker 运行tomcat 并部署 java web项目
    docker build no such file or directory
    Docker 笔记
    java 自动拆箱 自动装箱
    Ubuntu18 中文乱码 问题 解决
  • 原文地址:https://www.cnblogs.com/fhsadmins/p/5513228.html
Copyright © 2011-2022 走看看