SQL之性能优化
在实际应用中,数据库中的数据会有很多,若要从这些数据表中检索数据,就需要对系统进行优化,提高数据库系统的响应速度,下面就是日常一些查询优化的方法。
1.创建索引
索引可以提高数据库查询的速度,提高数据库的访问性能,但同时也会影响数据更新操作(例如插入、修改、删除)的速度。
-
如果WHERE子句中经常用到的某一列或者某几列创建索引
-
为数据表中经常需要执行排序操作的列创建索引
-
多表连接时,应该为数据表的连接列创建索引
-
对于需要不断更新的列,则不建议创建索引
2.优化查询语句
-
避免在SELECT语句中使用“*”
-
在使用SELECT语句时,应该在SELECT语句之后将要查询的信息一一列出来,即使要查询所有列的信息,也最好不要使用,从可读性上讲,方便用户对所要查询数据的理解。
-
调整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语句来改善数据库性能的方法,后面还会有相关的文章,敬请期待。