论坛首页 综合技术论坛

低效的where 1=1

浏览 41496 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2010-07-12   最后修改:2010-07-14
 
  也许很多人在开发多条件查询或模糊查询的时候,为保证不管选择哪种过滤条件总保证查询条件为true,于是在where子句后选择1=1或者0=0技巧来满足模糊查询。当然这的确对开发人员来说是一个不错的技巧。于是我在Mysql中通过上千万条的数据测试发现很耗性能。即便是建了常用字段的索引(排序)也没有作用,足以确定1=1很低效,大数据量很耗性能。

  select * from t_user where 1=1

   因为添加了"1=1"的过滤条件以后数据库系统无法使用索引等优化查询策略,数据库系统将会被迫对每行数据进行扫描(也就是全表扫描)来比较此行是否满足顾虑条件,当表中数据量比较大的时候查询速度会非常慢。


--------------------
maoone2003的回答甚是不错(红色部分) 作为开题人 我采纳...

select * from table where 1=1因为table中根本就没有名称为1的字段,所以该SQL等效于select * from table,这个SQL语句很明显是全表扫描,需要大量的IO操作,数据量越大越慢,建议查询时增加必输项,即where 1=1后面追加一些常用的必选条件,并且将这些必选条件建立适当的索引,效率会大大提高
PS:这不是SQL写法的问题,也不是数据库的问题,是自己程序逻辑的问题


   发表时间:2010-07-12  
我怎么从来没遇到过需要这么用的时候,举个例子
0 请登录后投票
   发表时间:2010-07-12   最后修改:2010-07-12
 
StringBuffer buffer = new StringBuffer("select * from T where 1=1 ");
for(Map.Enty e : map){
    buffer .appand ("and "+ e.getKey()+" = '"+e.getValue()+"'");
}
0 请登录后投票
   发表时间:2010-07-12  
添加这个没什么吧,有这个一般来讲后面都还有其他条件的
0 请登录后投票
   发表时间:2010-07-12  
一般是为了生成sql方便。
不会有性能问题。
0 请登录后投票
   发表时间:2010-07-12  
抛出异常的爱 写道
 
StringBuffer buffer = new StringBuffer("select * from T where 1=1 ");
for(Map.Enty e : map){
    buffer .appand ("and "+ e.getKey()+" = '"+e.getValue()+"'");
}


那到底对性能有影响吗?
0 请登录后投票
   发表时间:2010-07-12  
如果没有条件,可能是很快,只要有条件应该对应能影响不大。
0 请登录后投票
   发表时间:2010-07-12  
我刚试了 postgresql 和 oracle。

这个1=1根本不会处理,直接过滤了,该用索引的还是用索引。

不知道你测试的时候用的是什么样的环境和SQL语句?
0 请登录后投票
   发表时间:2010-07-12  
你把执行计划打开看看有没有区别好不?mysql不会这么弱智的吧。
0 请登录后投票
   发表时间:2010-07-12  
你是怎么看出来低效的?
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics