WHERE
子句中的书写注意事项
首先应考虑在 where 及 order by 涉及的列上建立索引。
- 下列操作会导致引擎放弃使用索引而进行全表扫描,是应尽量避免的。
1).在
where
子句中使用!=
或<>
操作符-
2).在
where
子句中对字段进行null
值判断
如:select id from t where num is null;
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0;
-
3).在
where
子句中使用 or 来连接条件
如:select id from t where num=10 or num=20;
可以这样查询:
select id from t where num=10 union all select id from t where num=20;
-
4).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);
-
5).在
where
子句中使用参数
因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时,它必须在编译时进行选择。
如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。
如下面语句将进行全表扫描:select id from t where [email protected];
可以改为强制查询使用索引:
select id from t with(index(索引名)) where [email protected]
-
6).在
where
子句中对字段进行函数、算术运算或其他表达式运算
如:select id from t where num/2=100; select id from t where date(createdate)>='2016-07-01';
应改为:
select id from t where num=100*2 select id from t where createdate>='2005-11-30 00:00:00';
模糊查询(like
)时需要注意的事项
-
左右都需要模糊匹配时,会导致全表扫描;
select id from t where tablename like '