SQL之性能优化

标签: sql 性能优化 | 发表时间:2014-05-25 06:01 | 作者:ZHOUCHAOQIANG
出处:http://blog.csdn.net


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

 

 

1.创建索引


索引可以提高数据库查询的速度,提高数据库的访问性能,但同时也会影响数据更新操作(例如插入、修改、删除)的速度。

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

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

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

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

 

 

2.优化查询语句

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

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

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

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

例如:查询员工工资表中工资在1000到3000的员工记录


语句一

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.避免使用OR关键字


匹配记录时,可以有两种方式,一种使用OR,另一种使用In,使用In关键字可以提高数据的查询速度

例如:

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 

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

相关子查询中使用EXISTS关键字代替IN关键字

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


6.EXISTS关键字查询


例子一:查询课程编号为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')


原因:在执行带有IN关键字的子查询时,数据库会首先执行子查询操作,将查询结果放到一个临时表中,主查询会在子查询执行完毕后再执行,而带有EXISTS关键字的相关子查询则是先检查主查询的第一条记录,通过子查询进行匹配,这个过程会反复执行,知道子查询全部检查完毕,这样就节省了时间。


7.使用LIKE关键字


使用LIKE关键字实现模糊查询时,需要注意一下。

例如查询学生编号中含有数字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语句来改善数据库性能的方法,后面还会有相关的文章,敬请期待。

 

 

作者:ZHOUCHAOQIANG 发表于2014-5-24 22:01:06 原文链接
阅读:91 评论:0 查看评论

相关 [sql 性能优化] 推荐:

Oracle SQL性能优化

- - 数据库 - ITeye博客
(1)      选择最有效率的表名顺序(只在基于规则的优化器中有效):. ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表. 如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.

SQL之性能优化

- - CSDN博客数据库推荐文章
在实际应用中,数据库中的数据会有很多,若要从这些数据表中检索数据,就需要对系统进行优化,提高数据库系统的响应速度,下面就是日常一些查询优化的方法. 索引可以提高数据库查询的速度,提高数据库的访问性能,但同时也会影响数据更新操作(例如插入、修改、删除)的速度. 如果WHERE子句中经常用到的某一列或者某几列创建索引.

Sql性能优化梳理

- - IT瘾-geek
本文主要针对的是关系型数据数据库MySql. 键值类数据库可以参考最简大数据Redis. 先简单梳理下Mysql的基本概念,然后分创建时和查询时这两个阶段的优化展开. 第一层:客户端通过连接服务,将要执行的sql指令传输过来. 第二层:服务器解析并优化sql,生成最终的执行计划并执行. 第三层:存储引擎,负责数据的储存和提取.

SQL性能优化十条经验

- - CSDN博客推荐文章
尽量避免在一个复杂查询里面使用 LIKE '%parm1%'—— 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用.. 其实只需要对该脚本略做改进,查询速度便会提高近百倍. a、修改前台程序——把查询条件的供应商名称一栏由原来的文本输入改为下拉列表,用户模糊输入供应商名称时,直接在前台就帮忙定位到具体的供应商,这样在调用后台程序时,这列就可以直接用等于来关联了.

记一次成功的sql注入入侵检测附带sql性能优化

- Bloger - 博客园-首页原创精华区
很多同学和园友都遇到过sql注入的,其中大部分都是代码的不严谨造成的,都是犯过很多错误才学会认真起来. 但是如果是让你接手一个二等残废的网站,并让你在上面改版,而且不能推翻式改版,只能逐步替换旧的程序,那么你会非常痛苦,例如我遇到的问题:.                                                                                                       .

SQL点滴22—性能优化没有那么神秘

- Bloger - 博客园-首页原创精华区
经常听说SQL Server最难的部分是性能优化,不禁让人感到优化这个工作很神秘,这种事情只有高手才能做. 很早的时候我在网上看到一位高手写的博客,介绍了SQL优化的问题,从这些内容来看,优化并不都是一些很复杂的问题,掌握了基本的知识之后也可以尝试优化自己的SQL程序,甚至是其他相关的程序. 优化是一些工作积累之后的经验总结和代码意识,只要平时注意积累,你也可以做优化的工作.

SQL Server 查询性能优化——堆表、碎片与索引(一)

- - 博客园_首页
      SQL Server在堆表中查询数据时,是不知道到底有多少数据行符合你所指定的查找条件,它将根据指定的查询条件把数据表的全部数据都查找一遍. 如果有可采用的索引,SQL Server只需要在索引层级查找每个索引分页的数据,再抓出所需要的少量数据分页即可. 访问数据表内数以万计的数据分页与只访问少数索引的分页两者间的差异,让索引变成效能调校的最佳工具.

MySQL 数据库性能优化之SQL优化

- - OurMySQL
注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础. IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是. SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段.

SQL Server 查询性能优化——创建索引原则(一)

- - 博客园_首页
索引是提高查询性能的一个重要工具,索引就是把查询语句所需要的少量数据添加到索引分页中,这样访问数据时只要访问少数索引的分页就可以. 但是索引对于提高查询性能也不是万能的,也不是建立越多的索引就越好. 索引建少了,用WHERE子句找数据效率低,不利于查找数据. 索引建多了,不利于新增、修改和删除等操作,因为做这些操作时,SQL SERVER除了要更新数据表本身,还要连带地立即更新所有的相关索引,而且过多的索引也会浪费硬盘空间.