与数据库交互的基本语言是sql,数据库每次解析和执行sql语句多需要执行很多步骤。以sql server为例,当数据库收到一条查询语句时,语法分析器会扫描sql语句并将其分成逻辑单元(如关键词、表达式、运算符和标识符)并生成查询树,最后查询优化器将分析所有可以访问数据库的源表的方法,从中选择一组返回结果集最快且消耗资源较少的步骤。查询树随即进行更新以准确记录这个步骤,接着交由数据库引擎开始执行,然后将查询结果返回给用户。可见数据库引擎每次执行sql命令都会有很大的开销,如果提交的sql质量不高甚至有逻辑错误就会造成无谓的开销和时间浪费。为了避免这种情况,在使用sql命令时应注意以下原则:

1、字段提取要按照“需多少、提多少”的原则,避免“select *”,尽量使用“select 字段1,字段2,字段3 ...”。实践证明,每少提取一个字段,数据库提取速度就会有相应的提升。提升的速度还要由你舍弃的字段大小来决定。

2、尽量使用exists代替select count(*) 来判断是否存在记录。优化器优化exists谓词时支持短路功能。只要找到一行,不需要再扫描其他行就可以确定该表是否包涵行了。count函数只有在统计表中所有行的行数时使用。

3、尽量使用(not) exists代替(not) in 操作,in的sql性能总是比较低的。

--语句

select  dname,deptno from dept where deptno not in(select deptno from emp where dept.deptno=emo.deptno)

--语句

select  dname,deptno from dept where not exists(select deptno from emp where dept.deptno=emo.deptno)

4、尽量使用not in,可以用left outer join代替它。

5、尽量不要使用or,使用or会引起全表扫描,将大大降低查询效率

6、注意where子句的写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能地让字段顺序与索引顺序一致,范围从大到小。

7、尽量使用“>=“,不用使用”>“

8、在编写sql语句之前了解表的索引结构。有效地利用索引能够避免不必要的全表扫描,缩短查询时间。应该避免在where子句中使用is null、<>、!=、not、 not exist、not in、not like等命令,他们通常会引起全表扫描导致索引无效。

9、在where 子句中,任何对列的操作(函数、计算等)讲导致索引失效,这些操作应该尽可能地移至等号右边,如where substring(id,1,1)=‘a‘,应该写成where id like ’a%‘;where result*10> 30应该写成where result >30;

对sql命令进行优化的基本原则是尽量减少类型转换和计算,充分利用表索引,减少全表扫描的次数。

最新文章

  1. mongoose学习笔记3--简单查询1
  2. Yii源码阅读笔记(十)
  3. JAVA SERVLET专题(下)
  4. Scala语法笔记
  5. 图片翻页效果引出的animate.css,很好玩,多动动吧~
  6. spring mvc 返回页面数据
  7. SpringMVC Spring MyBatis整合配置文件
  8. 阿里云centos 搭建SVN
  9. POJ 1655 Balancing Act【树的重心】
  10. 【medium】4. Median of Two Sorted Arrays 两个有序数组中第k小的数
  11. lombok @Accessors用法
  12. JIT(Just in time,即时编译,边运行边编译)、AOT(Ahead Of Time,运行前编译),是两种程序的编译方式
  13. unix scp命令(两个unix系统传输文件)
  14. 【洛谷4172】 [WC2006]水管局长(LCT)
  15. 解决stackoverflow打开慢的问题
  16. RESTful Loads
  17. Debian、Ubuntu恢复误删除(或者说重装)的/var/lib/dpkg
  18. python之面向对象进阶2
  19. 虚拟机vbox
  20. C语言复习---获取最小公倍数(公式法:两个数相乘等于最小公倍数乘以最大公约数)

热门文章

  1. java 命令行
  2. apache实现http自动转为https
  3. Jboss remote getshell (JMXInvokerServlet) vc版
  4. MYSQL进阶学习笔记一:MySQL编码设定,会话变量和全局变量!(视频序号:进阶_1-3)
  5. Android 实现http通信(servlet做服务器端) HttpClient、HttpURLConnection实现登录验证
  6. Intel微处理结构.docx
  7. lightoj1422 区间dp
  8. idea下建立bootstrap项目
  9. const指针和指向const的指针
  10. NOI 模拟赛 #3