写一条sql语句,不仅要实现功能,最主要的是要进行有效率的查询。前两天看了好多关于SQL优化的,现在就来总结一下。
一、建表的时候
1、合适的建立索引
索引可以提高select查询的效率,但是会降低insert及update的效率。
2、尽量避免在数据库中有null字段(该字段可以用0&1代替)
where子句中对字段进行null判断,会让引擎放弃使用索引而进行全表扫描,降低效率。
select id from t where num is null
3、尽量使用数值型字段
确定某字段只含数值信息的,尽量不要设计为字符型,这会降低查询和连接的性能。
二、SQL语句
1、尽量避免在where子句中使用!=或<>操作符
这两个符号会让引擎放弃索引而进行全表扫描。
2、应尽量避免在where子句中使用or来连接条件。
如果一个字段有索引,一个字段没有索引,会导致引擎放弃使用索引而进行全表扫描。
select id from t where num=10 or Name='admin'
可以写成:
select id from t where num=10
union all
select id from t where Name='admin'
3、使用in和not in 也会导致全表扫描,如:
select id from t where num in(1,2,3)
连续的数值的话可以用between代替in:
select id from t where num between 1 and 3
或者有时候用exists代替in:
select num from a where num in(select num from b)
--->
select num from a where exists(select 1 from b where num=a.num)
4、where子句使用参数也会全表扫描,如:
select id from t where num=@num
可以改为强制查询使用索引
select id from t with(index(索引名))where num=@num
5、where子句中对字段进行表达式操作或函数操作,也会导致全表扫描
//表达式操作
select id from t where num/2=100
-->
select id from t where num=100*2
//函数操作
select id from t where sunstring(name,1,3)='abd'
-->
select id from where name like'abc%'