锁定老帖子 主题:低效的where 1=1
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间: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写法的问题,也不是数据库的问题,是自己程序逻辑的问题 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-07-12
我怎么从来没遇到过需要这么用的时候,举个例子
|
|
返回顶楼 | |
发表时间: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()+"'"); } |
|
返回顶楼 | |
发表时间:2010-07-12
添加这个没什么吧,有这个一般来讲后面都还有其他条件的
|
|
返回顶楼 | |
发表时间:2010-07-12
一般是为了生成sql方便。
不会有性能问题。 |
|
返回顶楼 | |
发表时间: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()+"'"); } 那到底对性能有影响吗? |
|
返回顶楼 | |
发表时间:2010-07-12
如果没有条件,可能是很快,只要有条件应该对应能影响不大。
|
|
返回顶楼 | |
发表时间:2010-07-12
我刚试了 postgresql 和 oracle。
这个1=1根本不会处理,直接过滤了,该用索引的还是用索引。 不知道你测试的时候用的是什么样的环境和SQL语句? |
|
返回顶楼 | |
发表时间:2010-07-12
你把执行计划打开看看有没有区别好不?mysql不会这么弱智的吧。
|
|
返回顶楼 | |
发表时间:2010-07-12
你是怎么看出来低效的?
|
|
返回顶楼 | |