也許很多人在開發多條件查詢或模糊查詢的時候,爲保證不管選擇哪種過濾條件總保證查詢條件爲true,於是在where子句後選擇1=1或者0=0技巧來
滿足模糊查詢。當然這的確對開發人員來說是一個不錯的技巧。於是我在Mysql中通過上千萬條的數據測試發現很耗性能。即便是建了常用字段的索引(排序)
也沒有作用,足以確定1=1很低效,大數據量很耗性能。
select * from t_user where 1=1
因爲添加了"1=1"的過濾條件以後數據庫系統無法使用索引等優化查詢策略,數據庫系統將會被迫對每行數據進行掃描(也就是全表掃描)來比較此行是否滿足顧慮條件,當表中數據量比較大的時候查詢速度會非常慢。
select * from table where 1=1因爲table中根本就沒有名稱爲1的字段,所以該SQL等效於select * from table,這個SQL語句很明顯是全表掃描,需要大量的IO操作,數據量越大越慢,建議查詢時增加必輸項,即where 1=1後面追加一些常用的必選條件,並且將這些必選條件建立適當的索引,效率會大大提高
PS:這不是SQL寫法的問題,也不是數據庫的問題,是自己程序邏輯的問題
- StringBuffer buffer = new StringBuffer( "select * from T where 1=1 " );
- for (Map.Enty e : map){
- buffer .appand ("and " + e.getKey()+ " = '" +e.getValue()+ "'" );
- }