也许很多人在开发多条件查询或模糊查询的时候,为保证不管选择哪种过滤条件总保证查询条件为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写法的问题,也不是数据库的问题,是自己程序逻辑的问题
http://maozj.iteye.com/blog/710338
看成本...这是SqlServer中的测试
如果去掉where 1=1
成本为0%
那你为什么不顺手把去掉1=1的execution plan截图贴出来。测试没有发现你说的问题。
------------------------------
分享到:
相关推荐
#### 策略6:不等于要慎用 使用不等于操作符(`!=` 或 `)` 通常会导致全表扫描,因为这些操作无法利用索引。 - **示例**: - 使用不等于操作符: ```sql EXPLAIN SELECT * FROM staffs WHERE NAME!='July'; ...
##### 2.9 过滤匹配慎用函数 - 尽量避免在`where`子句中使用函数,这可能会导致索引失效。 - 示例: ```sql -- 错误示例 select * from tab1 where lower(col1) = 'value'; -- 正确示例 select * from tab1 ...
4. **慎用OR连接条件**:多个`OR`条件可能导致索引失效。推荐使用多个查询语句并用`UNION ALL`合并结果。 5. **合理使用IN和NOT IN**:使用`IN`或`NOT IN`可能导致全表扫描,特别是当列表很长时。对于连续的数值...
慎用自动增长字段 虽然自动增长字段使用方便,但可能会导致性能问题。 #### 23. 创建表时避免使用`SELECT INTO` 使用`SELECT INTO`创建表可能导致日志文件膨胀,应使用`CREATE TABLE`命令创建表后再进行数据插入...
11. 不要写一些没有意义的查询,如需要生成一个空表结构:select col1,col2 into #t from t where 1=0。 不要写一些没有意义的查询,这些查询将消耗系统资源,影响系统性能。应该避免这种情况,以提高系统性能。 ...
5. IN和NOT IN操作符也要慎用,以免引擎放弃使用索引而进行全表扫描。 六、数据库SQL优化之EXISTS代替IN操作符 6. 使用EXISTS代替IN操作符,可以提高查询效率。 七、数据库SQL优化之避免使用参数 7. 尽量避免在...
- **慎用 IN 和 NOT IN**:这些操作符可能导致全表扫描,尤其是在处理大量数据时。例如: ```sql SELECT id FROM t WHERE num IN (1, 2, 3); ``` 对于连续数值范围,建议使用 `BETWEEN` 替代 `IN`: ```sql ...
在SQL Server中,多表关联查询是常见的操作,特别是在处理复杂的数据分析和报表时。然而,在涉及字符串字段的关联时,尤其是当数据存在空格或不必要的字符时,开发者可能会选择在`WHERE`子句中使用`TRIM()`函数来...
// 删除所有记录(慎用) ``` 9. **聚合函数** - **COUNT()**:计算行数。 - **SUM()**:求和。 - **AVG()**:平均值。 - **MAX()**:最大值。 - **MIN()**:最小值。 10. **连接查询(JOINs)** - **...
#### 二十九、慎用游标 - **优化建议**:避免在性能敏感的应用中使用游标,因为它们通常比简单的查询慢很多。 - **示例**:尽量使用集合操作代替游标逐行处理。 #### 总结 通过以上优化措施,可以显著提高SQL语句...
// 删除表中所有数据,慎用! ``` 八、备份数据库 备份数据库是为了防止数据丢失。这通常通过数据库管理系统(如MySQL的`mysqldump`或SQL Server的`BACKUP DATABASE`)来完成,命令会因不同的数据库系统而异。 九...
慎用IN和NOT IN - **核心思想**:使用IN和NOT IN可能会导致全表扫描,尤其是当列表很长时。建议使用BETWEEN来替代。 - **示例**:查询年龄在1至3之间的员工信息。 ```sql -- 不推荐 SELECT * FROM employees ...
IN和NOT IN操作符也需要慎用,否则会导致全表扫描。可以使用EXISTS代替IN操作符,以提高查询效率。 六、避免使用LIKE操作符 在where子句中,尽量避免使用LIKE操作符,特别是使用通配符%。可以使用全文检索来提高...
- **慎用DISTINCT**:它会增加计算量,若非必要,尽量避免。 - **谨慎使用UNION**:如果可能,使用UNION ALL以减少排序操作,但要注意可能会引入重复记录。 - **获取最新数据**:优先使用聚合函数而非排序,比如...
` 则删除整个表(慎用)。 9. **JOIN操作**:用于合并两个或多个表的数据。`INNER JOIN`返回匹配的行,`LEFT JOIN`返回左表的所有行,即使右表没有匹配,`RIGHT JOIN`反之,`FULL JOIN`返回所有可能的组合。 10. *...
11. 不要写一些没有意义的查询,如需要生成一个空表结构:select col1,col2 into #t from t where 1=0。 这种查询将不会返回任何结果集,但是会消耗系统资源,影响系统性能。 12. exists可以代替in,是一个好的...
##### 2.9 过滤匹配慎用函数 在WHERE子句中尽量避免使用函数来过滤数据,因为这样做可能会导致索引失效,进而影响查询性能。 示例(避免): ```sql SELECT * FROM CUSTOMER WHERE UPPER(NAME) = 'JOHN'; ``` ...
10. 避免无意义的查询:编写查询语句时,应避免生成无意义的结果集,例如使用where 1=0这样的条件,这会消耗系统资源而无实际作用。应当使用更为高效的语句来达到相同的目的。 11. Update语句优化:若update语句只...