SQL --优化小结

对查询进行优化sql

0.任何地方都不要使用 select * from t_tble,要用具体的字段代替 *号,尽可能不要返回用不到的字段。
数据库

1.尽可能避免全表扫描,即以下语句
函数

select * from t_test

理论上不会存在如上业务,通常都会带上where,这样就快多了。优化

2.尽可能避免在where子句中进行null值判断,不然容易引发全表扫描,即以下语句设计

select * from t_test tt where tt.num is null

能够将num的默认值设置成0,确保num的值不会为null,修改查询以下code

select * from t_test tt where tt.num = 0

3.尽可能避免在where子句中使用or,如索引

select * from t_test tt where tt.num = 0 or tt.num = 1

能够修改sql为以下字符串

select * from t_test tt where tt.num = 0 
union all
select * from t_test tt where tt.num = 1

4.慎用in和not in,如string

select * from t_test tt where tt.num in(1000000000,1000000001,1000000002)

若是in里面的值是连续的数值,则可使用between来优化io

select * from t_test tt where tt.num between 1000000000 and 1000000002

5.尽可能避免在where子句中对字段进行表达式操做,如

select * from t_test tt where tt.num/2 = 10

修改sql以下

select * from t_test tt where tt.num = 10*2

6.尽可能避免在where子句中对字段进行函数操做,如

//找出以abc开头的字符串
select * from t_test tt where substring(tt.name,1,3) = 'abc'

修改SQL以下

//找出以abc开头的字符串
select * from t_test tt where tt.name like 'abc%'

7.有时候使用exists代替in是一个比较好的选择

select * from t_test tt where tt.num in (select tt2.num from t_test2 tt2)

优化成以下SQL语句

select * from t_test tt where exists (select 1 from t_test2 tt2 where tt2.num = tt.num)

8.索引并非越多越好,建立索引确实能够提升select的效率,可是同时也下降了insert和update的效率,由于insert和update时有可能须要重建索引。

9.尽可能使用数字型字段,若是只含有数值型的字段尽可能不要设计成字符型,这样会下降查询和链接的效率。由于数据库在处理查询时会逐个比较字符串中的每个字符,若是是数字类型的话,则不须要转换,直接比较。

10.尽可能使用varchar代替char,缘由不单单是节省存储空间,而是对于查询来讲,位数越小,比较越快。

11.尽可能使用表变量来代替临时表

12.若是使用到了临时表,在存储过程的最后必定要将全部的临时表显示删除,先truncate table,再drop table,这样能够避免系统表较长时间锁定。

相关文章
相关标签/搜索