一、概述
SQL语句当中最常用的分别是 SELECT,INSERT,UPDATE,DELETE以及MERGE,里面最重要的还是SELECT语句。
SELECT语句用来从一个或多个表中或者其他数据库对象中提取数据,SELECT语句查询的效率也决定了系统的性能,所以加快SELECT的查询速度是十分必要的,下面简单介绍下如何提高SELECT效率。
二、SELECT调优技巧
1、尽量避免使用select *,返回无用的字段会降低查询效率。
如:SELECT * FROM table t ,Oracle在遇到*符号时,会去查询数据字典表中获取所有的列信息,然后依次转换成所有的列名,这将耗费较长的执行时间,因此尽量避免使用*符号获取所有的列信息。
优化方式: SELECT column1,column2... FROM t
2、尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描。
如下:SELECT id FROM t WHERE score IS NULL
优化方式:可以给字段添加默认值0,对0值进行判断。如下:SELECT id FROM t WHERE score = 0
3、尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。
如:SELECT id FROM t WHERE score =10 or score =20
优化方式:
SELECT id FROM t WHERE score =10
union all
SELECT id FROM t WHERE score =20
4、尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描。
如下:SELECT score FROM t WHERE id IN (2,3)
SELECT score FROM t1 WHERE username NOT IN (SELECT iusername d FROM t2)
优化方式:如果是连续数值,可以用between代替。如下:
SELECT score FROM t WHERE id BETWEEN 2 AND 3 ,如果是子查询,可以用exists代替。如下:
SELECT score FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t1.username = t2.username)
注意:当 t2表比 t1 表数据大时适合使用exists(),因为它没有那么遍历操作,只需要再执行一次查询就行.
如:t1表有10000条记录,t2表有1000000条记录,那么exists()会执行10000次去判断t1表中的id是否与t2表中的id相等.
如:t1表有10000条记录,t2表有100000000条记录,那么exists()还是执行10000次,因为它只执行t1.length次,可见t2表数据越多,越适合exists()发挥效果.
再如:t1表有10000条记录,t2表有100条记录,那么exists()还是执行10000次,还不如使用in()遍历10000*100次,因为in()是在内存里遍历比较,而exists()需要查询数据库,我们都知道查询数据库所消耗的性能更高,而内存比较很快.
结论:exists()适合t2表比t1表数据大的情况,in适合 t2 比t1数据量小的情况。
5、尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描。如下:
SELECT * FROM t WHERE username LIKE '%li%'
优化方式:尽量在字段后面使用模糊查询。如下:
SELECT * FROM t WHERE username LIKE 'li%'
6、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
SELECT id FROM t WHERE score/2=400
SELECT id FROM t WHERE score <> 80
应改为:
SELECT id FROM t WHERE score=40*2
SELECT id FROM t WHERE score < 80 or score >80
7、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
如:SELECT id from t where substring(username,1,3)='abc' –name以abc开头的id
应改为:
SELECT id from t where username like 'abc%'
8、使用表的别名(Alias):
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。
9、sql语句用大写的;因为oracle总是先解析sql语句,把小写的字母转换成大写的再执行
三、总结
总结:通过上面的简单分析,SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让SQL的查询效率提高几十甚至几百倍,接下来我们接着介绍索引的概念。