通常不同SQL语句能够产生同样的结果,但是不同SQL代码所执行耗费的时间不完全相同,因此考虑到响应效率,必须对相应的代码进行调整,使其能够以最快的速度查询出我们想要的结果。
常见的优化方法有:
1.参数是子查询时,使用EXISTS代替IN。
in使用虽然非常方便,代码看起来也简单明了,但是会对子查询的结构进行一一扫描所以速度会相应的比较低。此时用到exists时速度会提高很多,因为EXISTS只要有一条数据符合条件就会返回结果。这是在子查询时可以做的优化,其他时候两个的效率相差不是很多。
-- 速度比较低
select * from shool where xuehao in (select xuehao from class)
-- 速度比较快
select * from shool a where exists (select xuehao from class b where a.xuehao=b.xuehao)
2.参数是子查询时,使用连接代替in。
可以使用连接表代替in,从而减少中间临时表的产生。
select * from school a join class b on a.xuehao = b.xuehao
3.避免排序。
排序也会影响查询的效率,因为排序可能会在磁盘中进行,效率会大大降低。常见的会排序的运算和函数有:group by ,order by ,聚合函数,distinct,union,以及窗口函数。因此在使用时可以考虑相关字段加上索引,以提高效率。
4.数据提前过滤。
如果数据有过滤条件时可以提前过滤,减少运算量。如在使用where和having时,过滤条件能写在where后面就不要写在having后面。
5.在使用group by 和order by 时子句中可以使用索引
order by和group by会进行排序,通过指定带索引的列可以提高查询效率。
6.减少中间表
在SQL中子查询会被看成是一个新表,这张表和原始表一样可以通过SQL操作。但是大量的中间表会严重影响效率提高计算时间。因此减少中间表的使用也是提高效率的一个重要方法。